Cross-Site Request Forgery (CSRF)
Definição
Cross-Site Request Forgery (CSRF) é uma vulnerabilidade que permite que um atacante induza um usuário autenticado a executar ações indesejadas em uma aplicação web, sem o seu consentimento.
O ataque funciona explorando a confiança que o site tem no navegador do usuário.
Por exemplo, ao visitar um site malicioso enquanto está autenticado em outro sistema (como um painel administrativo), o navegador pode enviar requisições automáticas contendo cookies válidos, realizando ações como:
- Trocar senha;
- Excluir dados;
- Realizar transações.
Objetivos da Prevenção de CSRF
- Evitar que comandos maliciosos sejam executados com privilégios legítimos.
- Proteger ações sensíveis em sistemas autenticados.
- Garantir que apenas requisições legítimas (com intenção real do usuário) sejam aceitas.
- Combater fraudes e manipulações automáticas via engenharia social.
Exemplo de ataque CSRF
Imagine uma aplicação onde, ao visitar a URL abaixo, a senha do usuário é alterada:
https://app.exemplo.com/alterar-senha?nova=123456
Se o sistema não exigir confirmação nem validar a origem da requisição, o atacante pode inserir esse link em um <img>
malicioso:
<img src="https://app.exemplo.com/alterar-senha?nova=123456" style="display:none" />
Se o usuário estiver autenticado na aplicação, o navegador envia automaticamente os cookies de sessão ao carregar essa imagem. Como a aplicação não exige confirmação adicional (como um token CSRF ou reautenticação), a senha é alterada sem o conhecimento do usuário.
Como prevenir
Utilize tokens anti-CSRF únicos por sessão (ex:
csrf_token
).Exija métodos seguros (
POST
,PUT
,DELETE
) para ações sensíveis.Valide o header
Origin
ouReferer
em requisições críticas.Exija reautenticação em operações de alto impacto.
Implemente autenticação de dois fatores.
Exemplo prático — inclusão de token CSRF em um formulário seguro
Suponha que o usuário esteja em uma página para transferir dinheiro:
<form method="POST" action="/transferir">
<!-- Token anti-CSRF gerado pelo servidor -->
<input type="hidden" name="csrf_token" value="abc123" />
<!-- Campo para valor da transferência -->
<input type="text" name="valor" placeholder="Valor" />
<button type="submit">Transferir</button>
</form>
O que está acontecendo aqui:
O servidor gera um token CSRF exclusivo (
abc123
) e o inclui no formulário como um campo oculto.Quando o usuário envia o formulário, esse token é enviado junto com a requisição.
O servidor então verifica se o token recebido corresponde ao que ele mesmo gerou e vinculou à sessão do usuário.
Se um site malicioso tentar forjar a requisição, ele não terá acesso ao token CSRF válido, já que esse valor só é conhecido pela aplicação legítima e pelo navegador do usuário. Assim, o ataque é bloqueado pelo servidor — mesmo que os cookies de sessão estejam presentes.
O ciclo da prevenção de CSRF
[Requisição do usuário] → [Verificação do token CSRF] → [Execução segura da ação] → [Proteção contra comandos externos]
O token impede que sites externos forjem requisições legítimas.
Apenas requisições com o token válido são processadas.