XSS vs CSRF: diferenças chave, exemplos e como prevenir ambos

Web Security
12 min de leitura
XSS vs CSRF: diferenças chave, exemplos e como prevenir ambos
Nesta página
  1. XSS vs CSRF: a diferença de relance
  2. O que é XSS (cross-site scripting)?
    1. Um exemplo de ataque XSS
  3. O que é CSRF (cross-site request forgery)?
    1. Como funciona um ataque CSRF
    2. Um exemplo de ataque CSRF
  4. Como XSS e CSRF diferem por dentro
  5. O XSS pode levar ao CSRF?
  6. Como prevenir XSS e CSRF
    1. Prevenindo XSS
    2. Prevenindo CSRF
  7. Impacto no mundo real
  8. Como testar XSS e CSRF
    1. Pratique com labs dedicados
  9. Considerações legais e éticas
  10. Perguntas frequentes
  11. Seus próximos passos

Duas falhas, duas invasões bem diferentes. Com o XSS (cross-site scripting), o atacante coloca o JavaScript dele rodando dentro de uma página confiável, onde pode ler tudo o que você vê. Com o CSRF (cross-site request forgery), o atacante nunca toca nessa página: é o site dele que, sem alarde, faz o seu navegador enviar uma requisição que o alvo aceita, do tipo "transfira R$ 1.000", e o seu cookie de sessão faz o resto.

Toda a diferença entre XSS e CSRF cabe em uma frase: XSS é código executando dentro do alvo; CSRF é uma requisição forjada disparada de fora dele. Os dois estão no OWASP Top 10, e o jeito mais rápido de sentir a diferença é explorar cada um uma vez: dispare um alert inofensivo no lab XSS Playground e depois forje uma transferência no lab de CSRF logo abaixo. Este guia coloca os dois ataques lado a lado, mostra por que um pode derrubar as defesas do outro e explica o que realmente detém cada um em 2026.

TL;DR: o XSS injeta o JavaScript do atacante em um site confiável, o que permite ler dados, roubar tokens e agir no lugar do usuário. O CSRF faz um navegador autenticado enviar uma requisição indesejada a partir de outro site; ele dispara ações mas não lê a resposta. Contra o XSS: codificação de saída conforme o contexto e Content Security Policy. Contra o CSRF: tokens anti-CSRF, cookies SameSite e verificação de Fetch Metadata. Se um site tem XSS, suas defesas de CSRF deixam de importar.

XSS vs CSRF: a diferença de relance

Qual é a diferença entre XSS e CSRF? O XSS faz o site vulnerável executar o script do atacante no navegador da vítima, com acesso total à página. O CSRF faz o navegador da vítima enviar uma requisição ao site vulnerável a partir de uma página controlada pelo atacante, abusando do fato de que os cookies vão junto automaticamente. O XSS pode ler e agir; o CSRF só pode agir.

Aspecto XSS CSRF
Onde o código do atacante roda Dentro da página do site vulnerável Na própria página do atacante
O que ele abusa A confiança do navegador no conteúdo do site A confiança do site no navegador do usuário
Precisa de Entrada de usuário exibida sem codificação Uma vítima logada e uma requisição sensível previsível
Consegue ler a resposta? Sim Não (same-origin policy)
Impacto típico Roubo de dados, tomada de conta, qualquer ação do usuário Uma ação forjada: transferência, troca de e-mail, de configurações
OWASP Top 10:2025 A05:2025 Injection (CWE-79) A01:2025 Broken Access Control (CWE-352)
Defesas principais Codificação de saída, CSP, cookies HttpOnly Tokens CSRF, cookies SameSite, Fetch Metadata

Jeito fácil de lembrar: o XSS coloca palavras na boca do site. O CSRF forja a assinatura do usuário.

O que é XSS (cross-site scripting)?

O cross-site scripting acontece quando uma aplicação coloca a entrada do usuário em uma página sem codificá-la: o navegador então interpreta essa entrada como HTML ou JavaScript em vez de exibi-la como texto. O script injetado roda sob a origem do site, com acesso à página, ao seu DOM, aos seus cookies não-HttpOnly e a tudo o que o usuário pode fazer.

Ele vem em três variantes, detalhadas no nosso guia de cross-site scripting:

  • XSS refletido: a carga viaja na requisição (em geral um parâmetro de URL) e é devolvida na resposta. A vítima precisa abrir um link malicioso.
  • XSS armazenado: a carga é salva (um comentário, uma bio) e servida a todo visitante. Sem link para enviar, o que o torna o tipo mais perigoso.
  • XSS baseado em DOM: o JavaScript do próprio site escreve um dado não confiável, como location.hash, na página. O servidor às vezes nunca vê a carga.

Um exemplo de ataque XSS

Uma página de busca devolve a consulta sem codificá-la:

<!-- PHP vulnerável -->
<p>Resultados para: <?php echo $_GET['q']; ?></p>

Envie q=tenis e a página mostra "Resultados para: tenis". Envie q=<script>alert(document.domain)</script> e o navegador interpreta isso como uma tag script real e a executa. A prova é um alerta inofensivo, mas o mesmo ponto de apoio permite que um script leia a página e envie requisições em nome do usuário logado. Se o cookie de sessão não estiver marcado como HttpOnly, ele também pode lê-lo diretamente, e é por isso que esse único atributo importa tanto.

💻
Pratique agora: lab XSS Playground - injete uma carga em um campo sem codificação, veja-a executar e aprenda qual contexto exige qual escape. No navegador, sem instalação.

O que é CSRF (cross-site request forgery)?

O cross-site request forgery faz o navegador de um usuário logado enviar uma requisição sensível a um site que confia nele. A página do atacante monta a requisição, o navegador anexa os cookies da vítima, e o servidor vê uma sessão válida e executa a ordem. Nada é injetado no site vulnerável.

Como funciona um ataque CSRF

  1. A vítima faz login em bank.example. Um cookie de sessão é guardado no navegador dela.
  2. Ela abre a página do atacante em outra aba, ainda logada.
  3. Essa página dispara uma requisição para bank.example, escondida numa tag de imagem ou num formulário autoenviado.
  4. O navegador anexa o cookie de sessão automaticamente, pois é assim que os cookies funcionam para qualquer requisição àquele domínio.
  5. O servidor a trata como legítima, sem conseguir distinguir uma requisição forjada de uma real.

Um exemplo de ataque CSRF

Para um endpoint que aceita GET, uma tag de imagem oculta na página do atacante já basta:

<!-- Na página do atacante -->
<img src="https://bank.example/transfer?to=mallory&amount=1000" style="display:none">

Para um endpoint POST, um formulário autoenviado faz o mesmo trabalho:

<form action="https://bank.example/transfer" method="POST" id="f">
  <input type="hidden" name="to" value="mallory">
  <input type="hidden" name="amount" value="1000">
</form>
<script>document.getElementById('f').submit();</script>

O ataque é invisível. A vítima carrega uma página e a transferência acontece, sem confirmação nem nada de estranho na tela. Isso só funciona enquanto ela tem uma sessão ativa e se o endpoint não tiver nenhuma proteção anti-CSRF.

Como XSS e CSRF diferem por dentro

O que é explorado

XSS: a confiança do navegador no conteúdo do site. O script injetado roda com todos os privilégios do site.

CSRF: a confiança do servidor nos cookies do navegador. Qualquer requisição com sessão válida é aceita.

O que o atacante consegue

XSS: leitura e escrita. Roubar dados, ler tokens, reescrever a página, executar qualquer ação.

CSRF: só escrita. Disparar uma ação, mas nunca ler a resposta.

Onde o código roda

XSS: dentro do próprio site vulnerável.

CSRF: na página do atacante, mirando o site vulnerável.

Dependência de sessão

XSS: funciona logado ou não (uma sessão ativa o torna mais valioso).

CSRF: só funciona contra uma sessão autenticada ativa.

O XSS pode levar ao CSRF?

Sim, e é por isso que o XSS é mais grave que o CSRF. Um token CSRF funciona porque a página externa do atacante não consegue lê-lo. Mas o XSS roda dentro da origem: o script injetado pode então ler o token direto da página e anexá-lo a uma requisição forjada. A requisição então parece perfeitamente legítima, token incluído.

Em outras palavras, um ponto de apoio de XSS atravessa as defesas de CSRF sem esforço. A conclusão prática: se um site tem XSS, você tem o CSRF de graça, mais a leitura dos dados. Corrigir o CSRF não faz nada contra o XSS, e um XSS não corrigido mina suas proteções de CSRF.

Como prevenir XSS e CSRF

Os dois exigem defesas diferentes. Tokens CSRF não fazem nada contra o XSS, e a codificação de saída não faz nada contra o CSRF. Você quer os dois conjuntos no lugar.

Prevenindo XSS

  • 🔒 Codificação de saída conforme o contexto. Faça escape do dado do usuário para o contexto exato onde ele cai (corpo HTML, atributo, JavaScript, URL). Esse é o conserto que acaba com a falha. Deixe o framework fazer escape por padrão e audite cada escape hatch como dangerouslySetInnerHTML ou um innerHTML cru.
  • 🛡️ Content Security Policy. Uma CSP estrita que bloqueia scripts inline é uma sólida segunda camada. Ela não conserta a falha, mas pode impedir uma carga de executar quando uma escapa.
  • 🍪 Cookies de sessão HttpOnly. Impedem o JavaScript de ler o cookie de sessão, neutralizando a forma mais direta de roubo de sessão. Combine com Secure.
  • ✅ Sanitize HTML rico com uma biblioteca testada. Se os usuários enviam HTML legitimamente, passe-o pelo DOMPurify em vez de um filtro caseiro.

Prevenindo CSRF

  • 🎫 Tokens anti-CSRF. Coloque um token imprevisível por sessão em cada formulário sensível e verifique-o no servidor. Uma página externa não consegue lê-lo nem adivinhá-lo.
  • 🍪 Cookies SameSite. SameSite=Lax (padrão do Chrome desde 2020) impede os cookies de irem na maioria das requisições cross-site; Strict é mais apertado. Trate como defesa em profundidade, não como único controle, pois é um comportamento do navegador, não uma verificação do servidor.
  • 🔍 Verificações de Fetch Metadata e Origin. Rejeite requisições sensíveis cujo cabeçalho Sec-Fetch-Site ou Origin mostre que vieram de outro site.
  • 🔐 Reautenticação para ações críticas. Exija senha ou uma etapa de confirmação para operações sensíveis como transferências.

Resumo em uma linha: defesa de XSS = codificar a saída + CSP + HttpOnly. Defesa de CSRF = tokens + SameSite + verificação de Origin.

Impacto no mundo real

XSS na prática

Worm Samy (MySpace, 2005): um worm de XSS armazenado que adicionava o autor como amigo e se copiava para o perfil de cada visitante, atingindo mais de um milhão de contas em menos de um dia.

Fortnite (2019): a Check Point encadeou uma falha de XSS em um subdomínio antigo da Epic Games com uma falha de redirecionamento OAuth para roubar tokens de login e tomar contas sem senha.

CSRF na prática

ING Direct (2008): os pesquisadores Zeller e Felten mostraram uma falha de CSRF capaz de tirar dinheiro da conta de uma vítima, um dos primeiros ataques de CSRF publicados contra um banco.

YouTube (2008): a mesma pesquisa encontrou CSRF em quase toda ação de usuário do site, de adicionar vídeos a mensagens.

Os dois ataques voltam sempre porque a confiança que eles abusam, um navegador confiando no conteúdo e um servidor confiando em um cookie, está inscrita no funcionamento da web. Veja o ranking atual no OWASP Top 10:2025.

Como testar XSS e CSRF

Checklist de teste de XSS

  • Injete um marcador único em cada entrada e leia o HTML cru para ver se ele volta codificado ou não.
  • Onde vier cru, molde uma carga para aquele contexto (corpo, atributo, script, URL).
  • Teste parâmetros de URL, campos de formulário, cabeçalhos e tudo o que uma SPA lê do fragmento da URL.
  • Prove o impacto com alert(document.domain), que mostra a origem de execução.

Checklist de teste de CSRF

  • Verifique se cada requisição sensível carrega um token anti-CSRF.
  • Remova ou altere o token e veja se o servidor ainda aceita a requisição.
  • Reenvie a requisição de outra origem sem o token.
  • Inspecione o atributo SameSite do cookie.

Pratique com labs dedicados

XSS Playground

Pratique XSS refletido, armazenado e baseado em DOM em um alvo seguro, e veja a codificação de saída deter cada um.

CSRF Bank Transfer

Forje uma transferência contra uma sessão logada, depois adicione um token e veja o ataque parar de funcionar.

Considerações legais e éticas

Lembrete essencial: obtenha autorização por escrito antes de testar qualquer site em busca de XSS ou CSRF. Disparar cargas ou requisições forjadas contra sistemas que não são seus é acesso não autorizado sob o Computer Fraud and Abuse Act (EUA), o Computer Misuse Act (Reino Unido) e leis equivalentes pelo mundo, mesmo quando a carga é um simples alert.

  • Teste apenas em sistemas seus, em alvos de treino propositalmente vulneráveis, ou dentro do escopo autorizado de um bug bounty ou contrato.
  • Use provas inofensivas. Não implante cargas que leiam dados de usuários reais para demonstrar impacto.
  • Se encontrar uma falha na aplicação de outra pessoa, reporte pelo processo de divulgação dela e pare por aí.
  • Os labs e cursos ligados aqui existem para praticar legalmente tanto o ataque quanto a defesa.

Perguntas frequentes

O CSRF é um tipo de XSS?

Não. São vulnerabilidades distintas, com mecanismos e correções diferentes. O XSS executa o código do atacante dentro do site alvo; o CSRF envia uma requisição forjada ao alvo a partir de outro lugar. O único elo: o XSS pode ser usado para derrubar as proteções de CSRF.

Qual é mais perigoso, XSS ou CSRF?

O XSS. Ele dá acesso completo de leitura e escrita dentro da sessão do usuário, não só uma ação, e pode ler tokens CSRF para contornar essas defesas. O CSRF se limita às ações que a vítima já está autorizada a fazer.

O CSRF pode roubar dados?

Não diretamente. Por causa da same-origin policy, a página do atacante não consegue ler a resposta de uma requisição cross-site. O CSRF pode mandar um banco transferir dinheiro mas não ler o saldo. O XSS, rodando dentro da origem, pode ler a resposta.

Tokens CSRF impedem o XSS?

Não. Tokens CSRF só detêm o CSRF. O XSS exige suas próprias defesas: codificação de saída conforme o contexto, Content Security Policy, cookies HttpOnly e escape automático do framework. Pior, o XSS pode ler um token CSRF da página e usá-lo.

Onde ficam XSS e CSRF no OWASP Top 10:2025?

O XSS faz parte de A05:2025 Injection (CWE-79), a mesma categoria da injeção SQL. O CSRF corresponde a A01:2025 Broken Access Control (CWE-352). Os dois seguem sendo achados comuns em aplicações web modernas.

Seus próximos passos

A distinção XSS vs CSRF se resume a uma pergunta: o código do atacante está rodando dentro do alvo, ou uma requisição forjada está sendo disparada de fora? O XSS é o serviço interno, com acesso de leitura e escrita e o poder de derrubar tokens CSRF. O CSRF é o serviço externo, limitado às ações que a vítima já pode fazer. Defenda o XSS com codificação de saída e uma CSP; defenda o CSRF com tokens, cookies SameSite e verificações de Origin; e lembre que corrigir um não faz nada pelo outro.

Ler só leva você até certo ponto. Dispare um script no XSS Playground e depois forje uma transferência no lab CSRF Bank Transfer. Para colocá-los em toda a superfície de ataque web, o capítulo de CSRF do nosso curso Web Attacks percorre os dois ao lado da injeção SQL e do resto do OWASP Top 10, em labs guiados no navegador. Comece com o plano gratuito da HackerDNA, sem cartão de crédito.

HackerDNA Team

Equipe HackerDNA

Escrito pela equipe HackerDNA - profissionais de cibersegurança que criam labs práticos de hacking e conteúdo educativo para ajudar você a desenvolver habilidades reais em segurança.

Conhecer a Equipe

Pronto para colocar isso em prática?

Pare de ler, comece a hackear. Máquinas reais, no seu navegador, grátis.

Comece a Hackear Grátis
30.000+ Hackers Labs reais Grátis
Comece Grátis ou resolva o hack de hoje, sem conta