# Προστατέψτε φόρμες και αιτήματα με tokens CSRF

> Δημιουργήστε ένα token με το $.csrf(), στείλτε το με το αίτημα και επαληθεύστε το σε ένα middleware ώστε να απορρίπτονται αιτήματα από άλλους ιστότοπους.

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

Μια επίθεση CSRF κάνει τον περιηγητή ενός συνδεδεμένου χρήστη να στείλει ένα αίτημα που ποτέ δεν σκόπευε. Η άμυνα είναι ένα token που η σελίδα λαμβάνει από τον διακομιστή σας και που πρέπει να επιστρέφει με κάθε αίτημα που αλλάζει δεδομένα. Το Total.js δημιουργεί και επαληθεύει το token για εσάς, αλλά μόνο όταν το `secret_csrf` είναι ορισμένο στο αρχείο `config` (χωρίς αυτό ο έλεγχος περνά πάντα).

Το `$.csrf()` επιστρέφει ένα token (και το `@{csrf}` το εκτυπώνει σε ένα view). Είναι μια κρυπτογραφημένη τιμή συνδεδεμένη με τη **διεύθυνση IP** και το **user agent** του πελάτη, που λήγει μετά τον χρόνο του `$csrfexpiration` (30 λεπτά από προεπιλογή). Το `DEF.onCSRFcheck($)` επαληθεύει το token που επέστρεψε, διαβασμένο από την κεφαλίδα `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 });
}
```
