# Chraňte formuláře a požadavky tokeny CSRF

> Vytvořte token přes $.csrf(), pošlete ho s požadavkem a ověřte ho v middleware, aby se požadavky z jiných stránek odmítly.

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

Útok CSRF způsobí, že prohlížeč přihlášeného uživatele odešle požadavek, který nikdy nechtěl odeslat. Obranou je token, který stránka dostane od vašeho serveru a který se musí vrátit s každým požadavkem měnícím data. Total.js token vytváří i ověřuje za vás, ale jen pokud je v souboru `config` nastaveno `secret_csrf` (bez něj kontrola vždy projde).

`$.csrf()` vrací token (a `@{csrf}` ho vypíše v pohledu). Je to šifrovaná hodnota vázaná na **IP adresu** a **user agent** klienta, která vyprší po době v `$csrfexpiration` (ve výchozím nastavení 30 minut). `DEF.onCSRFcheck($)` ověří token, který se vrátil, přečtený z hlavičky `x-csrf-token` nebo z parametru `csrf` v query stringu, a vrátí `true` nebo `false`. U běžných tras ji voláte sami, nejpohodlněji z middleware, který přidáte pomocí `#csrf` ke každé trase měnící data. Trasy WebSocket s příznakem `@csrf` se kontrolují automaticky.

```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 });
}
```
