# Formulare und Anfragen mit CSRF-Tokens schützen

> Erzeuge ein Token mit $.csrf(), sende es mit der Anfrage mit und prüfe es in einer Middleware, damit seitenübergreifende Anfragen abgelehnt werden.

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

Ein CSRF-Angriff lässt den Browser eines angemeldeten Benutzers eine Anfrage senden, die er nie beabsichtigt hat. Die Abwehr ist ein Token, das die Seite von deinem Server erhält und das mit jeder zustandsändernden Anfrage zurückkommen muss. Total.js erzeugt und prüft das Token für dich, aber nur, wenn `secret_csrf` in der Datei `config` gesetzt ist (ohne es besteht die Prüfung immer).

`$.csrf()` gibt ein Token zurück (und `@{csrf}` gibt es in einer View aus). Es ist ein verschlüsselter Wert, der an die **IP-Adresse** und den **User-Agent** des Clients gebunden ist und nach der Zeit in `$csrfexpiration` abläuft (standardmäßig 30 Minuten). `DEF.onCSRFcheck($)` prüft das zurückgekommene Token, gelesen aus dem Header `x-csrf-token` oder dem Query-String-Parameter `csrf`, und gibt `true` oder `false` zurück. Bei gewöhnlichen Routen rufst du es selbst auf, am bequemsten aus einer Middleware, die du mit `#csrf` an jede Route hängst, die Daten ändert. WebSocket-Routen mit dem Flag `@csrf` werden automatisch geprüft.

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