# Proteggere moduli e richieste con i token CSRF

> Crea un token con $.csrf(), invialo con la richiesta e verificalo in un middleware per rifiutare le richieste provenienti da altri siti.

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

Un attacco CSRF fa inviare al browser di un utente autenticato una richiesta che non voleva fare. La difesa è un token che la pagina riceve dal tuo server e che deve tornare con ogni richiesta che modifica dati. Total.js crea e verifica il token per te, ma solo se `secret_csrf` è impostato nel file `config` (senza di esso il controllo passa sempre).

`$.csrf()` restituisce un token (e `@{csrf}` lo stampa in una vista). È un valore cifrato legato all'**indirizzo IP** e allo **user agent** del client e scade dopo il tempo indicato in `$csrfexpiration` (30 minuti per impostazione predefinita). `DEF.onCSRFcheck($)` verifica il token tornato, letto dall'header `x-csrf-token` o dal parametro `csrf` della query string, e restituisce `true` o `false`. Per le rotte normali lo chiami tu, nel modo più comodo da un middleware che aggiungi con `#csrf` a ogni rotta che modifica dati. Le rotte WebSocket con il flag `@csrf` vengono controllate automaticamente.

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