# Protejează formularele și cererile cu token-uri CSRF

> Creează un token cu $.csrf(), trimite-l odată cu cererea și verifică-l într-un middleware pentru a respinge cererile venite de pe alte site-uri.

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

Un atac CSRF face ca browserul unui utilizator autentificat să trimită o cerere pe care nu a vrut-o niciodată. Apărarea este un token pe care pagina îl primește de la serverul tău și care trebuie să se întoarcă cu fiecare cerere ce modifică date. Total.js creează și verifică tokenul pentru tine, dar numai dacă `secret_csrf` este setat în fișierul `config` (fără el verificarea trece întotdeauna).

`$.csrf()` returnează un token (iar `@{csrf}` îl afișează într-un view). Este o valoare criptată legată de **adresa IP** și de **user agent**-ul clientului, care expiră după timpul din `$csrfexpiration` (30 de minute în mod implicit). `DEF.onCSRFcheck($)` verifică tokenul întors, citit din antetul `x-csrf-token` sau din parametrul `csrf` al query string-ului, și returnează `true` sau `false`. Pentru rutele obișnuite îl apelezi tu, cel mai comod dintr-un middleware pe care îl adaugi cu `#csrf` la fiecare rută care modifică date. Rutele WebSocket cu flagul `@csrf` sunt verificate automat.

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