# Protéger les formulaires et les requêtes avec des jetons CSRF

> Créez un jeton avec $.csrf(), envoyez-le avec la requête et vérifiez-le dans un middleware pour rejeter les requêtes provenant d'autres sites.

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

Une attaque CSRF fait envoyer au navigateur d'un utilisateur connecté une requête qu'il n'a jamais voulue. La défense est un jeton que la page reçoit de votre serveur et qui doit revenir avec chaque requête modifiant des données. Total.js crée et vérifie le jeton pour vous, mais seulement lorsque `secret_csrf` est défini dans le fichier `config` (sans lui, la vérification réussit toujours).

`$.csrf()` renvoie un jeton (et `@{csrf}` l'affiche dans une vue). C'est une valeur chiffrée liée à l'**adresse IP** et au **user agent** du client, qui expire après la durée de `$csrfexpiration` (30 minutes par défaut). `DEF.onCSRFcheck($)` vérifie le jeton revenu, lu dans l'en-tête `x-csrf-token` ou dans le paramètre `csrf` de la query string, et renvoie `true` ou `false`. Pour les routes ordinaires, vous l'appelez vous-même, le plus commodément depuis un middleware que vous ajoutez avec `#csrf` à chaque route qui modifie des données. Les routes WebSocket avec le flag `@csrf` sont vérifiées automatiquement.

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