ForgeTotal.js 5
pt

Total.js 5

Proteger formulários e pedidos com tokens CSRF

Total.js 5 · total5@0.0.19 securitycsrfmiddleware Executada com o Total.js 5

Um ataque CSRF faz com que o navegador de um utilizador autenticado envie um pedido que nunca pretendeu. A defesa é um token que a página recebe do seu servidor e que tem de voltar com cada pedido que altere dados. O Total.js cria e verifica o token por si, mas só quando secret_csrf está definido no ficheiro config (sem ele a verificação passa sempre).

$.csrf() devolve um token (e @{csrf} imprime-o numa vista). É um valor cifrado associado ao endereço IP e ao user agent do cliente, e expira passado o tempo de $csrfexpiration (30 minutos por omissão). DEF.onCSRFcheck($) verifica o token que voltou, lido do cabeçalho x-csrf-token ou do parâmetro csrf da query string, e devolve true ou false. Nas rotas normais é você que o chama, e o mais cómodo é fazê-lo a partir de um middleware que acrescenta com #csrf a cada rota que modifica dados. As rotas WebSocket com a flag @csrf são verificadas automaticamente.

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