O que é XSS (Cross-Site Scripting)

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 &lt;, 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.

Rolar para cima