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 ou Referer 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.

Relacionados

Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com