ForgeTotal.js 5
fr

Total.js 5

Protéger les formulaires et les requêtes avec des jetons CSRF

Total.js 5 · total5@0.0.19 securitycsrfmiddleware Exécutée avec Total.js 5

Une attaque CSRF fait envoyer au navigateur d'un utilisateur connecté une requête qu'il n'a jamais voulue. La défense est un jeton que la page reçoit de votre serveur et qui doit revenir avec chaque requête modifiant des données. Total.js crée et vérifie le jeton pour vous, mais seulement lorsque secret_csrf est défini dans le fichier config (sans lui, la vérification réussit toujours).

$.csrf() renvoie un jeton (et @{csrf} l'affiche dans une vue). C'est une valeur chiffrée liée à l'adresse IP et au user agent du client, qui expire après la durée de $csrfexpiration (30 minutes par défaut). DEF.onCSRFcheck($) vérifie le jeton revenu, lu dans l'en-tête x-csrf-token ou dans le paramètre csrf de la query string, et renvoie true ou false. Pour les routes ordinaires, vous l'appelez vous-même, le plus commodément depuis un middleware que vous ajoutez avec #csrf à chaque route qui modifie des données. Les routes WebSocket avec le flag @csrf sont vérifiées automatiquement.

config
secret_csrf : change-this-secret-in-production
definitions/csrf.js
MIDDLEWARE('csrf', function($, next) {
	if (DEF.onCSRFcheck($))
		next();
	else
		$.invalid(403);
});
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 });
}