Proteger formulários e pedidos com tokens CSRF
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.
secret_csrf : change-this-secret-in-productionMIDDLEWARE('csrf', function($, next) {
if (DEF.onCSRFcheck($))
next();
else
$.invalid(403);
});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 });
}