Texto para HTML: codificar entidades é uma defesa real contra XSS, não só formatação
Codificar entidades HTML — transformar < em
<, & em &,
" em " — parece uma operação de
formatação de texto, mas é, na prática, um mecanismo central de
segurança web: é exatamente essa codificação que impede que texto
fornecido por um usuário seja interpretado pelo navegador como código
HTML/JavaScript executável quando exibido de volta na página. Se um
campo de comentário armazena e exibe o texto de um usuário sem
codificar entidades, alguém pode inserir
<script>...</script> como "comentário", e esse
script executaria no navegador de qualquer outro usuário que visse a
página — a classe de vulnerabilidade conhecida como XSS
(Cross-Site Scripting), uma das mais comuns e mais antigas da web.
Por que esta ferramenta não usa substituição manual de caracteres
Uma implementação manual de codificação (uma sequência de
replace() para cada caractere especial) tem uma armadilha
clássica: a ordem das substituições importa. Codificar
</> antes de &
produziria novos caracteres & (parte de
<) que seriam codificados de novo na etapa
seguinte, corrompendo o resultado (escaping duplicado). Este
codificador evita esse problema inteiramente usando uma técnica
diferente: atribui o texto a div.textContent (que o
navegador trata como texto puro, nunca como HTML) e lê de volta
div.innerHTML — delegando a codificação para o próprio
serializador HTML nativo do navegador, em vez de reimplementar essa
lógica manualmente com regex. A decodificação usa o truque inverso:
atribui o texto a textarea.innerHTML e lê
textarea.value, aproveitando que o conteúdo de um
<textarea> nunca é interpretado como HTML executável
pelo navegador.
Codificar entidades não substitui as demais camadas de defesa contra XSS
Codificação de entidades protege especificamente o contexto de
"texto dentro de HTML" — mas um sistema real tem múltiplos contextos
de inserção (dentro de um atributo, dentro de uma URL, dentro de um
bloco <script>), cada um exigindo sua própria regra
de escaping específica. Confiar só em codificação de entidades HTML
para todo contexto de saída, sem considerar onde exatamente o dado do
usuário está sendo inserido, é uma causa real de vulnerabilidades XSS
que "parecem" corrigidas mas não estão — a defesa correta depende do
contexto de destino do dado, não de uma única função de escaping
aplicada universalmente.