XSS: Cross-Site Scripting em termos simples
XSS (cross-site scripting) é quando uma pessoa de fora consegue executar o código dela nas páginas do seu site, no navegador do visitante. A vulnerabilidade não está no servidor, mas na forma como o site exibe dados que vêm de fora: do endereço, de um formulário, de um comentário ou de um perfil.
Analogia para o dono do site
Imagine um mural na entrada de uma loja. Se alguém traz um bilhete dizendo "entregue as chaves do caixa ao portador" e você o pendura sem ler, o funcionário vai seguir as instruções de outra pessoa como se fossem suas. O XSS funciona do mesmo jeito: o site insere um texto estranho na página como se fosse dele, e o navegador executa tudo o que está ali, confiando totalmente no seu domínio.
Tipos de XSS
| Tipo | Onde ocorre | Quem é afetado |
|---|---|---|
| Refletido | O valor do endereço ou do formulário volta diretamente na resposta HTML | Quem clicou no link preparado |
| Armazenado | Um texto estranho fica salvo no banco de dados: comentário, avaliação, nome de perfil | Todos que abrirem essa página |
| Baseado em DOM | Os próprios scripts do site inserem dados do endereço na marcação | Visitantes, sem deixar rastros na resposta do servidor |
O que ele ameaça
- Sequestro de sessão. Um script estranho lê os cookies e acessa a conta ou o painel administrativo em nome do usuário.
- Spam e links ocultos. O site começa a promover assuntos que não têm relação com ele e perde a confiança dos buscadores.
- Aviso no navegador e nos resultados de busca. Se um código malicioso foi injetado por meio da vulnerabilidade, o domínio entra em bases de sites inseguros, o visitante vê o aviso "este site pode prejudicar você" e as páginas saem do índice.
Como aparece no relatório do Security Shield
O scanner insere um marcador inofensivo nos parâmetros da página e verifica se ele volta no HTML sem escape. Se voltar, aparece o alerta "Indício de XSS refletido": gravidade média, classe CWE-79, categoria OWASP A03:2021. A observação "requer verificação" significa que o serviço enxerga a superfície, mas não a explora.
As sondagens ativas só acontecem nos modos pagos e em domínios verificados: a verificação rápida gratuita não as realiza. O que mais é verificado está descrito no artigo sobre o Security Shield.
Abra o endereço e o parâmetro da linha "Onde foi encontrado" e peça ao desenvolvedor que verifique se esse valor recebe escape na saída. Refletir valores brutos no HTML é um sinal de que não há filtro aqui.
Como corrigir
- Aplique escape na saída. Os dados do usuário passam por codificação contextual antes de serem inseridos no HTML: <, >, aspas e o "e comercial" são convertidos em sequências seguras. Nos template engines, isso é uma única configuração.
- Verifique o que entra. Se o parâmetro é um número, aceite apenas números. Para textos com marcação, use uma biblioteca de limpeza de HTML confiável.
- Ative o CSP: mesmo com um erro no template, ele impede que um script estranho seja executado. Veja como começar no artigo sobre cabeçalhos de segurança.
- Proteja os cookies com as flags HttpOnly e Secure, para que a sessão não possa ser lida por JavaScript.
- Atualize o CMS, o tema e os plugins. A maior parte dos XSS em sites comuns vem de extensões de terceiros.
Como evitar que aconteça de novo
A regra é simples: todo novo campo que o visitante vê passa pela mesma saída segura que os demais. Mantenha o CSP ativado e repita as verificações após lançamentos e instalações de plugins. Uma auditoria de SEO também ajuda: um aumento repentino no número de links externos costuma ser o primeiro sinal de uma injeção.