Glossário

O que é CSRF (Cross-Site Request Forgery): um ataque que faz um usuário logado enviar requisições que ele não pretendia

O CSRF usa o navegador de um usuário logado para enviar uma requisição que ele não queria. Defesa: tokens CSRF, cookies SameSite e checagem de Origin.

Publicado 2026-06-08 Atualizado 2026-10-06 7 min de leitura
Nesta página

CSRF é quando simplesmente abrir outro site enquanto ainda está logado dispara uma transferência ou mudança de configuração sem você saber. Veja como ele funciona e como preveni-lo de forma confiável (sem passos de ataque).

Por que funciona (o mecanismo)

Um navegador anexa automaticamente os cookies de um site às requisições para aquele site. Então, se um usuário está logado no banco dele, uma requisição ao banco disparada a partir de uma página maliciosa ainda carrega "os cookies do usuário". Para o servidor, é indistinguível de uma ação legítima.

① O usuário está logado no site-alvo (possui um cookie)
↓ ele abre outra página
② Uma página maliciosa dispara uma requisição ao site-alvo
↓ o navegador anexa automaticamente o cookie do alvo
③ O servidor a executa como 'a ação do usuário' (transferência, configurações…)
Como o navegador envia cookies automaticamente, uma requisição 'por meio de outro site' passa como a ação do próprio usuário.

Enquanto o XSS "roda código no navegador da vítima", o CSRF "toma emprestado o estado logado da vítima" (→ O que é XSS).

Defesa

1

Exija um token CSRF

Em ações que mudam estado (envios de formulário, APIs), exija um token de uso único, inadivinhável, emitido pelo servidor; rejeite requisições sem ele. A maioria dos frameworks já entrega isso.

2

Defina cookies SameSite

Marque os cookies de sessão como SameSite=Lax (ou Strict) para que os cookies não sejam anexados a requisições originadas de outro site. Lax é o padrão moderno e ajuda muito por si só.

3

Não use GET para mudanças de estado

GET (visualização) não pode ter efeitos colaterais. Faça mudanças via POST/PUT/DELETE e passe-as pela validação de token.

4

Verifique Origin / Referer

Para ações sensíveis, verifique que a Origin da requisição é o seu próprio site e rejeite origens externas.

A visão deste site: na maior parte 'resolvido', mas não relaxe

Tokens CSRF de framework mais o padrão SameSite=Lax do navegador reduziram enormemente o CSRF clássico. Ainda assim, ele acontece em APIs customizadas, configurações legadas e painéis de administração que pularam o token. Mesmo que você "deixe a cargo do framework", verifique você mesmo uma vez que os caminhos que mudam estado de fato executam a validação de token.

Brechas comuns

Mesmo conhecendo o mecanismo, as implementações tendem a escorregar em dois pontos.

  • GET com efeitos colaterais: se um GET de visualização muda estado, uma tag de imagem ou um link simples já bastam para CSRF. Faça mudanças de estado via POST/PUT/DELETE e passe-as pela validação de token.
  • Esquecer a validação de token em alguns caminhos: APIs e recursos de administração adicionados depois costumam pular o token. Não presuma "o framework já tem" — inventarie todo caminho que muda estado uma vez.

CSRF vs XSS vs SSRF

Esses três nomes parecidos podem ser distinguidos por quem envia a requisição e do que se aproveitam.

AtaqueQuem envia a requisiçãoDo que se aproveitaDefesa principal
CSRFO navegador do usuário, sem que ele saibaO navegador anexar cookies automaticamenteTokens CSRF, cookies SameSite
XSSO script do invasor rodando no navegador do usuárioFalta de escape quando a página é renderizadaEscape na saída, CSP
SSRFO seu servidorUm recurso que busca uma URL recebidaAllowlist de destinos, bloqueio de endereços internos

CSRF e XSS agem ambos pelo navegador do usuário. Mas, se uma página tem XSS, um script dentro dela consegue ler o token CSRF, e as defesas contra CSRF são contornadas. A proteção contra CSRF pressupõe que o XSS já esteja resolvido.

Um caso real: uma publicação forjada tratada como sendo do próprio usuário

Em 2012, uma ameaça de ataque a escolas primárias foi publicada pelo formulário de opiniões do site da prefeitura de Yokohama, no Japão. O dono do PC de onde ela parecia ter vindo foi preso, e depois se descobriu que a prisão foi um erro.

Em dezembro daquele ano, segundo a imprensa japonesa, a polícia de Tóquio explicou que a publicação havia sido enviada usando CSRF: o navegador de um visitante foi levado a enviá-la depois que ele abriu um link publicado em um fórum.

Daí vêm duas lições.

  • Uma requisição CSRF parece exatamente a do próprio usuário: o servidor vê apenas o endereço IP e os cookies do usuário. Só pelos logs não dá para saber se ele a enviou ou foi levado a enviá-la.
  • Formulários sem login também entram na conta: aquele formulário de opiniões não exigia login. Coloque um token em todo envio que você não queira que terceiros disparem (publicações, inscrições, denúncias), exigindo login ou não.

O CSRF continua sendo uma fraqueza comum. No "CWE Top 25" da MITRE (as 25 fraquezas de software mais perigosas), publicado em dezembro de 2025, o CSRF (CWE-352) ficou em terceiro lugar.

Como verificar o seu próprio site

1

Defina SameSite explicitamente nos cookies de sessão

Verifique o atributo SameSite do cookie de sessão nas ferramentas de desenvolvedor do navegador (Application → Cookies) ou com a auditoria do site. Chrome e Edge tratam cookies sem o atributo como Lax, mas Safari e Firefox não fazem isso por padrão. Não dependa do padrão do navegador; defina você mesmo SameSite=Lax ou Strict.

2

Revise as exceções de CSRF

Verifique se a proteção contra CSRF do framework está desligada em algumas rotas (o csrf_exempt do Django, a lista de exceções do Laravel, o skip_forgery_protection do Rails etc.). Onde houver motivo para desligá-la, como um receptor de webhook, proteja a rota com verificação de assinatura.

3

Procure rotas GET que mudam estado

Percorra sua lista de rotas em busca de GETs que apagam, atualizam ou fazem logout. Passe-as para POST ou equivalente e coloque-as na validação de token.

4

Acrescente mais uma verificação às ações sensíveis

Para trocar senha ou e-mail, enviar dinheiro ou conceder permissões, peça a senha atual ou a autenticação multifator além do token. Mesmo que uma requisição seja forjada, a confirmação do usuário a detém.

Fontes (primárias)

  • OWASP, "Cross-Site Request Forgery Prevention Cheat Sheet" (em inglês) — cheatsheetseries.owasp.org (tokens, Sec-Fetch-Site, limites do SameSite, XSS contornando as defesas contra CSRF, nada de mudança de estado via GET)
  • MITRE, "2025 CWE Top 25 Most Dangerous Software Weaknesses" (dezembro de 2025, em inglês) — cwe.mitre.org (CWE-352 em terceiro lugar)
  • web.dev, "SameSite cookies explained" (em inglês) — web.dev (quais navegadores tratam cookies sem o atributo como Lax)
  • INTERNET Watch, reportagem sobre o caso do malware de controle remoto (14 de dezembro de 2012, em japonês) — internet.watch.impress.co.jp (explicação da polícia de que o CSRF foi usado na publicação de Yokohama)
  • @IT, artigo sobre as prisões indevidas causadas por malware de personificação e CSRF (novembro de 2012, em japonês) — atmarkit.itmedia.co.jp
  • IPA, "How to Secure Your Web Site" — ipa.go.jp (em japonês)

Leia a seguir

Classificação

O CWE classifica os tipos de fraqueza por trás das vulnerabilidades; o MITRE ATT&CK classifica as técnicas dos atacantes. Ambos são mantidos pela MITRE e amplamente usados para rotular vulnerabilidades e regras de detecção.

CWE™: Copyright © 2006–2026, The MITRE Corporation. CWE is a trademark of The MITRE Corporation. The MITRE Corporation hereby grants you a non-exclusive, royalty-free license to use CWE for research, development, and commercial purposes. Any copy you make for such purposes is authorized on the condition that you reproduce MITRE’s copyright designation and this license in any such copy. CWE Terms of Use

FAQ

QQual é a diferença entre CSRF e XSS?
A

O XSS roda um script no navegador da vítima; o CSRF usa o estado logado da vítima para enviar uma requisição não intencional. O CSRF funciona até sem rodar nenhum script — apenas com o navegador enviando cookies automaticamente.

QQual é a principal defesa contra CSRF?
A

Exija um token CSRF em requisições que mudam estado (POST, etc.) e defina SameSite (Lax/Strict) nos cookies de sessão. A maioria dos frameworks já entrega o token por padrão. Além disso: nunca use GET para mudanças de estado.

QSameSite sozinho é suficiente?
A

Ajuda muito, mas não é completo sozinho. Restam brechas em navegadores antigos, em certas navegações e em algumas configurações de subdomínio — então combine-o com tokens CSRF para defesa em profundidade.

QFormulários que não exigem login também precisam de proteção contra CSRF?
A

Às vezes, sim. Mesmo um formulário de contato ou de publicação pode ser enviado a partir de outro site pelo navegador de um visitante, e o servidor registra o endereço IP desse visitante como remetente. No Japão, em 2012, uma ameaça publicada no site da prefeitura de Yokohama havia sido enviada via CSRF, e o dono do PC de onde ela parecia ter vindo foi preso por engano. Coloque um token em qualquer formulário que você não queira que terceiros enviem em nome de um visitante, exigindo login ou não.

QAPIs JSON que autenticam com tokens Bearer precisam de proteção contra CSRF?
A

Depende de a autenticação usar cookies. O CSRF depende de o navegador anexar cookies automaticamente. Uma API que só aceita credenciais que o próprio app adiciona, como um token Bearer no cabeçalho Authorization, em geral não está exposta ao CSRF, porque outro site não consegue fazer o navegador adicioná-lo. Se a API autentica com cookies, ela precisa de tokens ou de uma verificação de Origin.

QO que é Sec-Fetch-Site, e ele consegue deter o CSRF?
A

É um cabeçalho de requisição que o navegador adiciona para dizer se a requisição veio da mesma origem ou do mesmo site (same-origin / same-site) ou de outro site (cross-site). O guia de CSRF da OWASP lista como uma das defesas rejeitar, com base nele, requisições cross-site que mudam estado. Navegadores antigos não o enviam, então mantenha uma verificação de Origin como reserva.