# Chroń formularze i żądania tokenami CSRF

> Utwórz token przez $.csrf(), wyślij go z żądaniem i zweryfikuj w middleware, aby odrzucać żądania z innych witryn.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: pl
Content-SHA256: ede3f0c6efb49be6cf49c2ee8ed10e75db428f514639c137b89c56018934649f
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

Atak CSRF sprawia, że przeglądarka zalogowanego użytkownika wysyła żądanie, którego nigdy nie zamierzał wysłać. Obroną jest token, który strona otrzymuje z Twojego serwera i który musi wrócić z każdym żądaniem zmieniającym dane. Total.js tworzy i weryfikuje token za Ciebie, ale tylko gdy w pliku `config` ustawiono `secret_csrf` (bez niego sprawdzenie zawsze przechodzi).

`$.csrf()` zwraca token (a `@{csrf}` wypisuje go w widoku). To zaszyfrowana wartość powiązana z **adresem IP** i **user agentem** klienta, która wygasa po czasie z `$csrfexpiration` (domyślnie 30 minut). `DEF.onCSRFcheck($)` weryfikuje token, który wrócił, odczytany z nagłówka `x-csrf-token` lub z parametru `csrf` w query stringu, i zwraca `true` lub `false`. W zwykłych trasach wywołujesz ją sam, najwygodniej z middleware, który dodajesz przez `#csrf` do każdej trasy zmieniającej dane. Trasy WebSocket z flagą `@csrf` są sprawdzane automatycznie.

```text config
secret_csrf : change-this-secret-in-production
```

```js definitions/csrf.js
MIDDLEWARE('csrf', function($, next) {
	if (DEF.onCSRFcheck($))
		next();
	else
		$.invalid(403);
});
```

```js controllers/csrf.js
exports.install = function() {
	ROUTE('GET /form/', form);
	ROUTE('POST /transfer/ @json #csrf', transfer);
};

function form($) {
	$.json({ csrf: $.csrf() });
}

function transfer($) {
	$.json({ ok: true, amount: $.body.amount });
}
```
