# Skydda formulär och förfrågningar med CSRF-token

> Skapa en token med $.csrf(), skicka med den i förfrågan och verifiera den i en middleware så att förfrågningar från andra webbplatser avvisas.

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

En CSRF-attack får en inloggad användares webbläsare att skicka en förfrågan som den aldrig avsåg. Försvaret är en token som sidan får från din server och som måste komma tillbaka med varje förfrågan som ändrar data. Total.js skapar och verifierar token åt dig, men bara när `secret_csrf` är satt i filen `config` (utan den lyckas kontrollen alltid).

`$.csrf()` returnerar en token (och `@{csrf}` skriver ut den i en vy). Det är ett krypterat värde knutet till klientens **IP-adress** och **user agent** som löper ut efter tiden i `$csrfexpiration` (30 minuter som standard). `DEF.onCSRFcheck($)` verifierar den token som kommit tillbaka, läst från headern `x-csrf-token` eller query-parametern `csrf`, och returnerar `true` eller `false`. För vanliga rutter anropar du den själv, smidigast från en middleware som du lägger till med `#csrf` på varje rutt som ändrar data. WebSocket-rutter med flaggan `@csrf` kontrolleras automatiskt.

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