# Защитете формулярите и заявките с CSRF токени

> Създайте токен с $.csrf(), изпратете го със заявката и го проверете в middleware, за да се отхвърлят заявки от други сайтове.

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

CSRF атаката кара браузъра на влязъл потребител да изпрати заявка, която той никога не е възнамерявал. Защитата е токен, който страницата получава от вашия сървър и който трябва да се върне с всяка заявка, променяща данни. Total.js създава и проверява токена вместо вас, но само когато `secret_csrf` е зададен във файла `config` (без него проверката винаги минава).

`$.csrf()` връща токен (а `@{csrf}` го отпечатва във view). Това е криптирана стойност, свързана с **IP адреса** и **user agent** на клиента, която изтича след времето в `$csrfexpiration` (30 минути по подразбиране). `DEF.onCSRFcheck($)` проверява върнатия токен, прочетен от хедъра `x-csrf-token` или от параметъра `csrf` на query string, и връща `true` или `false`. При обикновените маршрути го извиквате вие, най-удобно от middleware, който добавяте с `#csrf` към всеки маршрут, променящ данни. WebSocket маршрутите с флага `@csrf` се проверяват автоматично.

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