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:
- 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.
- Escape de saída (Output Encoding): codifique dados antes de inseri‑los em HTML, atributos, JavaScript, CSS ou URL. Use funções como
htmlspecialcharsno PHP, ou bibliotecas de template que escapam por padrão (React, Vue, Angular). - 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. - Uso de frameworks seguros: frameworks modernos (React, Angular, Vue) automaticamente escapam expressões no template. Evite manipulação direta do DOM com
innerHTML. - 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.
- Evitar sinks perigosos: minimize o uso de
eval,document.write,innerHTML,outerHTML,insertAdjacentHTMLe 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.