XSS (Cross-Site Scripting) é uma vulnerabilidade de segurança em aplicações web que permite a execução de código JavaScript malicioso no navegador de outros usuários.
Em outras palavras: quando um site exibe dados vindos do usuário sem validar nem escapar, ele abre a porta para ataques que podem roubar sessões, redirecionar usuários ou até executar scripts de mineração de criptomoeda.
Tipos de XSS
1. Refletido (Reflected XSS)
O código malicioso é enviado em uma requisição (geralmente via URL) e refletido na resposta do servidor.
Exemplo vulnerável:
<?php
// index.php
$nome = $_GET['nome'];
echo "Olá, $nome!";
Se alguém acessar:
http://exemplo.com/index.php?nome=<script>alert('XSS')</script>
O navegador executa o alert, mostrando que o site foi vulnerável.
2. Armazenado (Stored XSS)
O script é salvo no banco de dados — por exemplo, em um campo de comentário — e executado toda vez que outro usuário visualiza o conteúdo.
Esse é o tipo mais perigoso, pois pode afetar vários usuários de forma persistente.
3. DOM-Based XSS
O ataque acontece inteiramente no lado do cliente (JavaScript), quando o código manipula o DOM com dados não confiáveis.
Exemplo vulnerável:
<div id="saida"></div>
<script>
document.getElementById('saida').innerHTML = location.hash;
</script>
Acessando:
http://exemplo.com/#<img src=x onerror=alert('XSS')>
O navegador executa o script dentro do hash da URL.
Como corrigir
1. Escapar corretamente a saída
No PHP, use:
echo htmlspecialchars($nome, ENT_QUOTES, 'UTF-8');
Isso converte caracteres especiais em entidades HTML seguras (< vira <, por exemplo).
2. Sanitizar entrada do usuário
Remova tags HTML não permitidas. Bibliotecas como HTML Purifier ajudam a manter o conteúdo limpo.
3. Definir cabeçalhos de segurança
Adicione uma Content Security Policy (CSP) para limitar scripts:
header("Content-Security-Policy: default-src 'self'; script-src 'self';");
4. Evitar innerHTML e document.write() no front-end
Use textContent ou createElement() para manipular texto dinamicamente.
Exemplo corrigido
<?php
$nome = $_GET['nome'] ?? '';
$nomeSeguro = htmlspecialchars($nome, ENT_QUOTES, 'UTF-8');
?>
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<title>Exemplo seguro</title>
</head>
<body>
<p>Olá, <?= $nomeSeguro ?>!</p>
</body>
</html>
Agora, mesmo que alguém tente injetar:
<script>alert('XSS')</script>
o navegador exibirá literalmente o texto, sem executar o script.
Conclusão
O XSS é uma das falhas mais comuns em sistemas web.
A prevenção é simples: nunca confie em dados de entrada e escape tudo que for exibido no HTML.
Pequenas medidas, como htmlspecialchars() e uma boa política de CSP, já eliminam a maioria das brechas.
