Glossário

O que é XSS (Cross-Site Scripting): uma falha que roda o script de um invasor no navegador de outro usuário

XSS faz o script de um invasor rodar no navegador de outro usuário e roubar a sessão. Os três tipos e a defesa: escape na saída, auto-escape e CSP.

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

XSS é quando um texto digitado em um formulário roda como script na tela de outra pessoa. Veja como funciona e como evitá-lo de forma confiável (sem passos de ataque).

Os três tipos

O XSS se divide por "como a string maliciosa chega à execução".

TipoComo é plantado
ArmazenadoSalvo em um post/perfil e roda para todos que o visualizam (o mais perigoso)
RefletidoUm parâmetro da URL é refletido de volta direto na página; roda para quem clicar no link
Baseado em DOMSem ida e volta ao servidor — o JS do lado do cliente trata a entrada de forma insegura

Por que é perigoso (como funciona)

O navegador roda qualquer <script> na página como "código legítimo". Se a string de um invasor cai como HTML na página, o navegador não consegue distingui-la do código real.

① O invasor publica uma 'string' (comentário, nome, URL…)
↓ o servidor a exibe sem escapar
② A string se mistura na página como HTML
↓ uma vítima abre a página
③ O código roda no navegador da vítima = roubo de sessão, personificação
Renderize uma string fornecida pelo usuário 'como está' e o navegador a executa como código.

O dano é "tudo o que aquela página pode fazer". Se o RCE é a falha mais grave do lado do servidor, o XSS é a mais grave do lado do cliente (usuário).

Defesa: escape na saída

O XSS é prevenido na saída, não na entrada. No momento em que você renderiza um valor, converta-o para que não possa ser interpretado como HTML.

1

Escape na saída (o mais importante)

Ao renderizar valores fornecidos pelo usuário, converta < > & " ' em entidades HTML — usando o método certo para o contexto (corpo HTML, atributo, JS, URL).

2

Não desabilite o auto-escape do seu framework

React/Vue/templates fazem auto-escape por padrão. Apenas evite a injeção de HTML cru (dangerouslySetInnerHTML, v-html) e você previne a maior parte do XSS.

3

Defesa em profundidade com CSP

A Content-Security-Policy permite que o navegador bloqueie scripts que você não autorizou, limitando o dano mesmo que algo passe.

4

Proteja os cookies

Marque os cookies de sessão como HttpOnly para que o JS não possa lê-los. Mesmo que um XSS passe, o dano é menor.

A visão deste site: a melhor defesa é não desabilitar você mesmo os recursos de segurança

Frameworks modernos vêm seguros por padrão. A maior parte do XSS aparece no momento em que um desenvolvedor desabilita deliberadamente o auto-escape para "injetar HTML cru". Se você realmente precisa permitir HTML, passe-o por um sanitizador comprovado, e não pelo seu próprio tratamento de strings. "Desabilitar a segurança por conveniência" é o maior risco.

Como o XSS difere de ataques com que é confundido

O XSS costuma ser confundido com o CSRF, que tem nome parecido, e com a injeção de SQL, que também é um caso de entrada tratada como instrução. A diferença está no que roda e onde.

AtaqueO que acontece, e ondeDefesa principal
XSSO script do invasor roda no navegador do usuário como parte da página realEscape na saída, CSP
CSRFA sessão logada do usuário é usada para enviar uma requisição que ele não pretendia. Nenhum script precisa rodarTokens CSRF, cookies SameSite
Injeção de SQLA entrada é interpretada no servidor como parte de uma instrução SQLPlaceholders
ClickjackingA página real é sobreposta de forma invisível para que o usuário clique nela sem saberCSP frame-ancestors

Note que o XSS também derruba as defesas contra CSRF. Quando um script roda dentro da página, ele consegue ler também o token CSRF daquela página (o guia de CSRF da OWASP faz o mesmo alerta).

Um caso real: XSS em uma tela aberta pela equipe

Em 2026, a Instructure, empresa por trás do sistema de gestão de aprendizagem Canvas, informou que uma invasão começou com XSS. Segundo a empresa, o invasor usou uma conta gratuita para enviar um chamado de suporte com código malicioso e, quando um atendente o abriu, uma falha de XSS foi explorada para obter privilégios elevados dentro do Canvas (→ o vazamento de dados do Canvas (Instructure)).

A lição é que o XSS não é um problema só de páginas públicas. Telas de suporte, de contato e de administração que mostram à sua equipe textos enviados de fora têm risco maior, porque as contas que as abrem têm mais poder.

O XSS continua entre as fraquezas mais comuns. No "CWE Top 25" da MITRE (as 25 fraquezas de software mais perigosas), publicado em dezembro de 2025, o XSS (CWE-79) ficou em primeiro lugar. Em setembro de 2024, as agências americanas CISA e FBI também publicaram um alerta pedindo que os fabricantes de software eliminem o XSS de seus produtos.

Como verificar o seu próprio site

Você não precisa testar strings de ataque. Comece por estas quatro verificações.

1

Encontre os pontos que inserem HTML cru

Procure no seu código por dangerouslySetInnerHTML, v-html, innerHTML e document.write, e verifique se algum valor fornecido pelo usuário pode chegar até eles. Se puder, renderize-o como texto ou passe-o por um sanitizador comprovado.

2

Verifique se a CSP é enviada

Use a Verificação de cabeçalhos de segurança para ver se a Content-Security-Policy está presente e o que ela permite. Permitir 'unsafe-inline' a enfraquece muito contra XSS. Para escrever uma nova, faça o rascunho com o Gerador de CSP e rode-a primeiro em modo Report-Only (que apenas relata violações).

3

Verifique as flags do cookie de sessão

Nas ferramentas de desenvolvedor do navegador (Application → Cookies), confirme que o cookie de sessão tem HttpOnly e Secure. A auditoria do site também verifica as flags dos cookies.

4

Inclua as telas de administração e suporte

Verifique se as telas internas que mostram textos vindos de fora (corpo de chamados, nomes de arquivo, nomes de exibição) fazem o escape com o mesmo padrão das páginas públicas.

Fontes (primárias)

  • OWASP, "Cross Site Scripting Prevention Cheat Sheet" (em inglês) — cheatsheetseries.owasp.org (escape por contexto de saída, padrões seguros dos frameworks)
  • MITRE, "2025 CWE Top 25 Most Dangerous Software Weaknesses" (dezembro de 2025, em inglês) — cwe.mitre.org (CWE-79 em primeiro lugar)
  • CISA e FBI, "Secure by Design Alert: Eliminating Cross-Site Scripting Vulnerabilities" (17 de setembro de 2024, em inglês) — cisa.gov
  • OWASP, "Cross-Site Request Forgery Prevention Cheat Sheet" (em inglês) — cheatsheetseries.owasp.org (o XSS pode contornar as defesas contra CSRF)
  • 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

QO que acontece com o XSS?
A

O script de um invasor roda no navegador da vítima como parte da página real. Isso pode significar roubo de sessão (login personificado), leitura de entradas, desfiguração da página ou execução automática de outras ações.

QQual é a principal defesa contra XSS?
A

Escape na saída: ao renderizar valores fornecidos pelo usuário, converta-os para que não sejam interpretados como HTML. Templates de React/Vue fazem isso por padrão, então a maior vitória é não desabilitar esse auto-escape (evite dangerouslySetInnerHTML, etc.). Adicione CSP para defesa em profundidade.

QSanitizar na entrada é suficiente?
A

Normalmente não. A defesa confiável é escapar por contexto de saída (corpo HTML, atributo, JS, URL). Filtros de entrada sozinhos vazam por incompatibilidade de contexto. Apenas quando você precisa permitir HTML, passe-o por um sanitizador confiável.

QPor que se chama XSS e não CSS?
A

As iniciais de Cross-Site Scripting formam CSS, mas isso se confunde com o CSS (Cascading Style Sheets), a linguagem que define o visual das páginas web. Por isso o 'Cross' é escrito como X, e XSS virou a abreviação padrão.

QSe eu implantar CSP, ainda preciso de outras defesas contra XSS?
A

Sim. A CSP (Content-Security-Policy) é uma segunda camada que limita o dano quando o escape falha. Uma CSP que permite 'unsafe-inline' perde boa parte do valor contra XSS. O escape na saída continua sendo a base; a CSP fica por cima dele.

QSe meus cookies são HttpOnly, o XSS deixa de ser um problema?
A

Reduz o dano, mas não o elimina. O HttpOnly só impede que scripts leiam o cookie. Um script rodando via XSS ainda pode enviar requisições como o usuário de dentro da página e ler tudo o que a página mostra. O HttpOnly limita o dano; ele não previne o XSS.