Cross-Site Scripting (XSS) é uma vulnerabilidade de segurança web que permite que atacantes injetem scripts maliciosos em páginas visualizadas por outros usuários. Este tipo de ataque explora a confiança que um usuário tem em um determinado site, podendo resultar em roubo de dados, sequestro de sessão, desfiguração de sites e redirecionamentos para páginas maliciosas.

Neste artigo, vamos explorar os fundamentos do XSS, os tipos existentes, os riscos associados e, principalmente, as melhores práticas para prevenir essa vulnerabilidade em suas aplicações.

O que é Cross-Site Scripting (XSS)?

XSS é uma falha de injeção que ocorre quando dados fornecidos pelo usuário são incluídos em uma página web sem a devida validação ou escape. Quando o navegador renderiza o conteúdo malicioso como parte legítima da página, o script é executado no contexto do site vulnerável, permitindo ao atacante acessar cookies, tokens de sessão, redirecionar o usuário ou modificar o conteúdo da página.

A vulnerabilidade XSS está presente em diversas variações, como Reflected XSS, Stored XSS e DOM‑based XSS. Compreender cada tipo é fundamental para implementar defesas eficazes.

Tipos de XSS: Reflected, Stored e DOM‑based

Reflected XSS (XSS Refletido)

Também conhecido como XSS não persistente, ocorre quando o script malicioso é refletido na resposta do servidor a partir de uma requisição, normalmente através de parâmetros na URL. O ataque exige que a vítima clique em um link especialmente criado. É comum em páginas de erro, resultados de busca ou formulários que ecoam a entrada do usuário.

Stored XSS (XSS Armazenado)

Nesta variação persistente, o código malicioso é armazenado no servidor (banco de dados, sistema de arquivos, etc.) e posteriormente servido a todos os visitantes da página afetada. Exemplos incluem comentários, posts em fóruns, campos de perfil e qualquer funcionalidade que permita a entrada persistente de dados. Stored XSS é considerado mais crítico, pois pode atingir múltiplos usuários sem necessidade de engenharia social.

DOM‑based XSS (XSS baseado em DOM)

Ocorre quando a vulnerabilidade está no código JavaScript do lado do cliente, que manipula o DOM de forma insegura. O ataque não depende de uma resposta modificada do servidor; ele se concretiza quando um script cliente utiliza dados de uma fonte não confiável (como fragmento da URL, localStorage, window.name) e os insere em um sink perigoso (innerHTML, document.write, eval).

Como um ataque XSS acontece na prática?

Imagine um campo de busca que exibe o termo pesquisado: <p>Você buscou por: [termo]</p>. Se o site não escapar a saída, um atacante pode inserir <script>alert('XSS')</script>. Cada usuário que acessar a página com o parâmetro malicioso verá o script executado. Em um cenário real, o script poderia coletar cookies e enviá‑los a um servidor controlado pelo invasor.

No Stored XSS, um comentário em um blog pode conter código malicioso. Todos os visitantes da página que visualizarem o comentário estarão expostos. O DOM‑based XSS dispensa a interação com o servidor; ele ocorre quando o código front‑end lê dados do URL via location.hash e os insere diretamente no DOM sem sanitização.

Quais os riscos do XSS?

  • Roubo de sessão: o invasor pode capturar cookies de autenticação (a flag HttpOnly oferece proteção parcial).
  • Keylogging: scripts podem monitorar teclas pressionadas para capturar senhas.
  • Desfiguração de site: o conteúdo da página pode ser alterado.
  • Phishing: o atacante pode exibir formulários falsos para roubo de credenciais.
  • Download de malware: o script pode forçar o download de arquivos maliciosos.

Como prevenir XSS (Boas práticas)

A prevenção eficaz combina validação de entrada, sanitização, escape de saída e políticas de segurança em camadas. Abaixo estão as principais medidas:

  1. Validação e sanitização de entrada (Input Validation & Sanitization): rejeite ou sanitize caracteres especiais com base em uma lista branca. Nunca confie em entradas do cliente.
  2. Escape de saída (Output Encoding): codifique dados antes de inseri‑los em HTML, atributos, JavaScript, CSS ou URL. Use funções como htmlspecialchars no PHP, ou bibliotecas de template que escapam por padrão (React, Vue, Angular).
  3. Content Security Policy (CSP): defina uma política de segurança de conteúdo que restrinja fontes de scripts (ex: script-src 'self'). O CSP mitiga significativamente o impacto de XSS, mesmo quando a injeção ocorre.
  4. Uso de frameworks seguros: frameworks modernos (React, Angular, Vue) automaticamente escapam expressões no template. Evite manipulação direta do DOM com innerHTML.
  5. HttpOnly e Secure flags em cookies: ao definir cookies de sessão com a flag HttpOnly, o JavaScript não pode acessá‑los, dificultando o roubo de sessão por XSS.
  6. Evitar sinks perigosos: minimize o uso de eval, document.write, innerHTML, outerHTML, insertAdjacentHTML e funções semelhantes.

Além disso, realize testes de segurança regulares (SAST, DAST, revisão manual) para detectar pontos de injeção.

Exemplo prático: Reflected XSS em uma página de busca

Suponha a URL https://site.com/busca?q=termo que gera a resposta:

<html>
  <p>Você pesquisou por: <?= $_GET['q'] ?></p>
</html>

Sem escape, se o usuário acessar ?q=<script>evil()</script>, o script será executado. A correção seria escapar a saída: <?= htmlspecialchars($_GET['q'], ENT_QUOTES, 'UTF-8') ?>.

Perguntas Frequentes (FAQ)

O que é XSS (Cross‑Site Scripting)?

É uma vulnerabilidade de segurança que permite a injeção de scripts maliciosos em páginas web visualizadas por outros usuários, explorando a confiança no site.

Quais os tipos de XSS?

Os principais são: Reflected (não persistente), Stored (persistente) e DOM‑based (lado do cliente).

Como saber se minha aplicação está vulnerável a XSS?

Realize testes de segurança como scanner de vulnerabilidades (ex: OWASP ZAP, Burp Suite) e revisão de código focada em sinks perigosos e falta de escape.

CSP bloqueia todos os ataques XSS?

Não completamente, mas dificulta muito a exploração. CSP deve ser usado em conjunto com as demais práticas de codificação segura.

O que é a flag HttpOnly?

Uma flag em cookies que impede o acesso via JavaScript, protegendo contra roubo de sessão em ataques XSS.