O que Proteção CSRF faz?
Regras
- Defina
SameSite=Lax em todos os cookies — isso bloqueia a maioria dos ataques CSRF por padrão
- Use
SameSite=Strict para ações altamente sensíveis (exclusão de conta, alteração de senha)
- Implemente o padrão de submissão dupla de cookie para APIs customizadas: token CSRF no cookie + cabeçalho da requisição
- Inclua tokens CSRF em todos os formulários HTML que realizam ações de alteração de estado
- Verifique os cabeçalhos
Origin e Referer em requisições de alteração de estado como defesa em profundidade
- Next.js Server Actions e SvelteKit form actions tratam CSRF automaticamente — utilize-os
- Para SPAs: envie o token CSRF em um cabeçalho customizado (
X-CSRF-Token) — navegadores bloqueiam cabeçalhos customizados cross-origin por padrão
import crypto from "crypto";
function generateCsrfToken(res) {
const token = crypto.randomBytes(32).toString("hex");
res.cookie("csrf_token", token, { httpOnly: false, sameSite: "strict", secure: true });
return token;
}
function verifyCsrf(req) {
const cookieToken = req.cookies.csrf_token;
const headerToken = req.headers["x-csrf-token"];
if (!cookieToken || cookieToken !== headerToken) {
throw new Error("Falha na validação CSRF");
}
}
Evite
- Confiar apenas em autenticação baseada em cookie sem proteção CSRF — qualquer site pode enviar formulários para seus endpoints
- Tokens CSRF que nunca rotacionam — um token vazado compromete todas as requisições futuras
- Requisições GET que alteram estado — a proteção CSRF só funciona em POST/PUT/DELETE porque requisições GET ignoram SameSite=Lax
- Desabilitar a proteção CSRF porque "é apenas uma API" — se cookies estão envolvidos, CSRF se aplica