HTML Escape e Unescape

Converte <, >, &, aspas e apóstrofo em entidades e o caminho inverso.

Descrição

Útil para inserir trechos em HTML, templates e atributos sem quebrar o markup. O decode usa o DOM do navegador para entidades comuns.

Detalhamento técnico

Os cinco caracteres que fundamentam a segurança HTML

  • `<` (menor que) → `&lt;`: É o caractere que inicia qualquer tag HTML. Sem escape, qualquer conteúdo dinâmico pode injetar tags arbitrárias. Deve ser sempre o primeiro caractere a ser escapado em texto não confiável.
  • `>` (maior que) → `&gt;`: Fecha tags. Embora browsers modernos tolerem `>` não escapado em alguns contextos, escapar consistentemente elimina uma classe de vetores de injeção sutis, como `</script>` dentro de blocos JavaScript inline.
  • `&` (e comercial) → `&amp;`: Inicia entidades HTML. Deve ser escapado antes dos outros — se você escapar `<` antes de `&`, pode acabar com `&lt;` sendo reescapado para `&amp;lt;`. A ordem correta é sempre: `&` primeiro.
  • `"` (aspas duplas) → `&quot;`: Crítico em atributos delimitados por aspas duplas. `<input value="{{userInput}}">` sem escape permite que o usuário insira `" onclick="alert(1)` e encerre o atributo prematuramente, injetando handlers de eventos.
  • `'` (aspas simples) → `&#39;`: Relevante em atributos delimitados por aspas simples. Menos comum em HTML5 (aspas duplas são o padrão), mas frequente em templates PHP, Django e Rails que às vezes usam aspas simples na geração dinâmica de atributos.

XSS persistente, refletido e baseado em DOM: três vetores de ataque

  • XSS persistente (stored XSS): o payload malicioso é armazenado no banco de dados e exibido para todos os usuários que visitam a página. É o mais perigoso: um único post de fórum ou comentário de produto pode comprometer todos os visitantes. O worm Samy no MySpace foi stored XSS.
  • XSS refletido: o payload vem de uma URL ou parâmetro e é refletido imediatamente na resposta. Exemplo: `https://site.com/busca?q=<script>roubarCookies()</script>`. Requer que a vítima clique no link malicioso, mas é trivial de distribuir via phishing ou encurtadores de URL.
  • DOM-based XSS: o JavaScript do próprio site lê um valor de uma fonte não confiável (`location.hash`, `document.cookie`, `window.name`) e o escreve diretamente no DOM com `innerHTML` ou `document.write` sem sanitização. Não passa pelo servidor — ferramentas de análise server-side não detectam.
  • Content Security Policy (CSP) é a segunda linha de defesa: um header HTTP que informa ao browser quais scripts são permitidos. `Content-Security-Policy: default-src 'self'` bloqueia scripts de outros domínios e inline scripts sem nonce. Não substitui o escape, mas mitiga impacto de XSS residual.
  • XSS é diferente de CSRF (Cross-Site Request Forgery): XSS executa código no browser da vítima no contexto do site alvo; CSRF forja requisições autenticadas sem executar código. Ambos precisam de defesas separadas: escape + CSP para XSS, tokens CSRF para CSRF.

Guia da ferramenta

  • O que é HTML Linguagem de marcação de páginas: tags como <p>, atributos e entidades. Caracteres especiais dentro de texto ou atributos precisam ser escapados para não serem interpretados como markup.

  • O que são entidades HTML Representações como &lt; para <, &amp; para &, etc., para inserir texto literal sem quebrar o documento.

  • O que a ferramenta faz Converte texto para entidades (escape) ou decodifica entidades de volta ao texto.

  • Por que usar Inserir exemplos em documentação, templates, e-mails HTML ou atributos value sem executar acidentalmente tags.

Exemplo de Código

Função escapeHtml() em JavaScript (por que & deve ser primeiro)
// ERRADO: escapar < antes de & pode criar double-escape
// Input: '<b>'
// Passo 1 (< → &lt;): '&lt;b>'
// Passo 2 (& → &amp;): '&amp;lt;b>' ← double-escape!

// CORRETO: & sempre primeiro
function escapeHtml(str) {
  return String(str)
    .replace(/&/g, '&amp;')   // 1. & PRIMEIRO
    .replace(/</g, '&lt;')    // 2. <
    .replace(/>/g, '&gt;')    // 3. >
    .replace(/"/g, '&quot;')  // 4. "
    .replace(/'/g, '&#39;');  // 5. '
}

// Exemplos:
console.log(escapeHtml('<script>alert(1)</script>'));
// → &lt;script&gt;alert(1)&lt;/script&gt;

console.log(escapeHtml('5 < 10 & "dois" > \'um\''));
// → 5 &lt; 10 &amp; &quot;dois&quot; &gt; &#39;um&#39;
Sanitização com DOMPurify (configurações comuns)
import DOMPurify from 'dompurify';

// Básico: remove tudo perigoso, mantém formatação
const htmlSeguro = DOMPurify.sanitize(htmlEntrada);

// Restritivo: apenas texto e formatação básica
const apenasTexto = DOMPurify.sanitize(htmlEntrada, {
  ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'p', 'br'],
  ALLOWED_ATTR: [],
});

// Com links permitidos (mas javascript: bloqueado)
const comLinks = DOMPurify.sanitize(htmlEntrada, {
  ALLOWED_TAGS: ['a', 'p', 'strong', 'em', 'ul', 'ol', 'li'],
  ALLOWED_ATTR: ['href', 'title', 'target'],
  FORBID_ATTR: ['onerror', 'onload', 'onclick'],
});

// Verificar se o input foi modificado pela sanitização:
const original = '<p onclick="alert(1)">Texto</p>';
const limpo = DOMPurify.sanitize(original);
console.log(original === limpo); // false → input continha conteúdo malicioso

Antes / depois

<script> → &lt;script&gt;

Perguntas frequentes

Para que serve esta ferramenta?

Ela roda 100% no seu navegador: útil para validar, formatar ou converter dados no dia a dia de desenvolvimento.

Meus dados são enviados a algum servidor?

O processamento é feito localmente via JavaScript. Não armazenamos o conteúdo que você cola nas caixas de texto.

Posso usar em produção ou para dados reais?

Use por sua conta e risco. Para segredos (senhas, tokens), prefira ambientes controlados e políticas da sua empresa. E lembre sempre de revisar os conteúdos gerados. Nunca confie cegamente nas coisas que vê na internet.