ForgeTotal.js 5
nl

Total.js 5

Formulieren en verzoeken beschermen met CSRF-tokens

Total.js 5 · total5@0.0.19 securitycsrfmiddleware Uitgevoerd met Total.js 5

Een CSRF-aanval laat de browser van een ingelogde gebruiker een verzoek sturen dat die nooit bedoelde. De verdediging is een token dat de pagina van je server krijgt en dat met elk verzoek dat gegevens wijzigt terug moet komen. Total.js maakt en controleert het token voor je, maar alleen als secret_csrf in het bestand config is ingesteld (zonder slaagt de controle altijd).

$.csrf() geeft een token terug (en @{csrf} drukt het af in een view). Het is een versleutelde waarde die aan het IP-adres en de user agent van de client is gekoppeld en verloopt na de tijd in $csrfexpiration (standaard 30 minuten). DEF.onCSRFcheck($) controleert het teruggekomen token, gelezen uit de header x-csrf-token of de queryparameter csrf, en geeft true of false terug. Bij gewone routes roep je het zelf aan, het handigst vanuit een middleware die je met #csrf toevoegt aan elke route die gegevens wijzigt. WebSocket-routes met de vlag @csrf worden automatisch gecontroleerd.

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