# Formulieren en verzoeken beschermen met CSRF-tokens

> Maak een token met $.csrf(), stuur het mee met het verzoek en controleer het in een middleware zodat verzoeken van andere sites worden geweigerd.

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

Een CSRF-aanval laat de browser van een ingelogde gebruiker een verzoek sturen dat die nooit bedoelde. De verdediging is een token dat de pagina van je server krijgt en dat met elk verzoek dat gegevens wijzigt terug moet komen. Total.js maakt en controleert het token voor je, maar alleen als `secret_csrf` in het bestand `config` is ingesteld (zonder slaagt de controle altijd).

`$.csrf()` geeft een token terug (en `@{csrf}` drukt het af in een view). Het is een versleutelde waarde die aan het **IP-adres** en de **user agent** van de client is gekoppeld en verloopt na de tijd in `$csrfexpiration` (standaard 30 minuten). `DEF.onCSRFcheck($)` controleert het teruggekomen token, gelezen uit de header `x-csrf-token` of de queryparameter `csrf`, en geeft `true` of `false` terug. Bij gewone routes roep je het zelf aan, het handigst vanuit een middleware die je met `#csrf` toevoegt aan elke route die gegevens wijzigt. WebSocket-routes met de vlag `@csrf` worden automatisch gecontroleerd.

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