Back

Uma Primeira Olhada na API HTML Sanitizer

Uma Primeira Olhada na API HTML Sanitizer

Se você já usou innerHTML para renderizar conteúdo gerado por usuários, aceitou algum nível de risco de XSS. A solução usual é incorporar uma biblioteca como DOMPurify para sanitizar a string primeiro. Isso funciona, mas significa enviar JavaScript extra e confiar em terceiros para se manterem à frente do comportamento evolutivo do parser do navegador. A API HTML Sanitizer é a resposta do navegador para este problema—e vale a pena entendê-la agora, mesmo que ainda não esteja pronta para uso em produção em todos os lugares.

Principais Conclusões

  • innerHTML analisa e injeta marcação sem qualquer verificação de segurança, tornando-se um vetor persistente de XSS ao lidar com conteúdo gerado por usuários.
  • A API HTML Sanitizer introduz métodos seguros como Element.setHTML() que automaticamente removem scripts, manipuladores de eventos e URLs perigosas antes de inserir conteúdo no DOM.
  • Você pode configurar o Sanitizer com listas de permissão ou remoção para controlar exatamente quais elementos e atributos sobrevivem à sanitização.
  • O suporte dos navegadores ainda é limitado no início de 2026, portanto o código de produção deve usar detecção de recursos e recorrer ao DOMPurify como alternativa.

Por Que innerHTML Sempre Foi um Risco

innerHTML faz exatamente o que você pede: analisa uma string e injeta o resultado no DOM, sem fazer perguntas. Isso é conveniente até que alguém passe <img src=x onerror="stealCookies()"> como um comentário ou nome de usuário.

Bibliotecas como DOMPurify resolvem isso analisando a string por conta própria, percorrendo a árvore DOM resultante e removendo qualquer coisa perigosa antes de devolvê-la a você. É eficaz, mas frágil. O comportamento de análise do navegador muda ao longo do tempo, e uma biblioteca que vive no espaço do usuário tem que constantemente perseguir essas mudanças. O próprio navegador, por outro lado, sempre sabe exatamente como irá analisar e executar um determinado pedaço de marcação.

O Que a API HTML Sanitizer Fornece

A API HTML Sanitizer nativa move a sanitização para dentro do navegador. Em vez de definir innerHTML diretamente, você usa novos métodos que analisam, sanitizam e injetam em uma única etapa.

Os métodos seguros são aqueles que você usará com mais frequência:

  • Element.setHTML()
  • ShadowRoot.setHTML()
  • Document.parseHTML()

Estes sempre removem conteúdo inseguro contra XSS—tags <script>, atributos manipuladores de eventos como onclick, URLs javascript: em atributos de navegação—independentemente da configuração que você passar. Sem nenhuma configuração, setHTML() é essencialmente um substituto direto para innerHTML com proteção automática contra XSS:

const userContent = `<p>Hello!</p><script>alert('xss')<\/script>`;
document.getElementById("output").setHTML(userContent);
// Renderiza: <p>Hello!</p>
// O <script> é silenciosamente removido

Os métodos insegurossetHTMLUnsafe(), ShadowRoot.setHTMLUnsafe() e Document.parseHTMLUnsafe()—oferecem mais controle. Eles aplicam apenas a configuração do sanitizador que você fornecer, sem impor a linha de base segura contra XSS. Use-os apenas quando tiver uma razão específica para permitir elementos ou atributos que os métodos seguros bloqueariam, e apenas com uma configuração cuidadosamente construída.

Configurando o Sanitizer

Ambas as famílias de métodos aceitam uma instância opcional de Sanitizer ou um dicionário de configuração. Você pode construir uma configuração de permissão (especificar exatamente o que é permitido, descartar todo o resto) ou uma configuração de remoção (especificar o que remover, permitir todo o resto).

Uma configuração de permissão é geralmente a escolha mais segura:

const sanitizer = new Sanitizer({
  elements: ["p", "b", "em", "a"],
  attributes: ["href"]
});

document.getElementById("comments").setHTML(untrustedInput, { sanitizer });

A classe Sanitizer também expõe métodos como allowElement() e removeElement() para modificar configurações programaticamente mantendo-as internamente consistentes.

Suporte dos Navegadores e O Que Fazer a Respeito

Aqui está o panorama honesto: no início de 2026, a API HTML Sanitizer apenas começou a ser implementada nos navegadores. O Firefox 148 adicionou suporte, e o Chrome 146 seguiu, mas a disponibilidade ampla entre navegadores ainda está se consolidando. Ainda não faz parte da plataforma web Baseline, o que significa que você não pode confiar que estará disponível para todos os seus usuários hoje. Você pode acompanhar o suporte atual no Can I Use.

Para código de produção, use detecção de recursos e recorra ao DOMPurify como alternativa:

if (typeof Element.prototype.setHTML === "function") {
  element.setHTML(untrustedHTML);
} else {
  element.innerHTML = DOMPurify.sanitize(untrustedHTML);
}

Conclusão

A API HTML Sanitizer representa exatamente o tipo de coisa que os padrões dos navegadores deveriam fazer: pegar um padrão perigoso e amplamente mal gerenciado e tornar o caminho seguro o caminho fácil. setHTML() versus innerHTML ainda não é realmente um debate—o suporte dos navegadores toma essa decisão por você. Mas entender a API agora significa que você estará pronto para adotá-la à medida que o suporte se amplia, e terá uma visão mais clara do que a sanitização HTML nativa do navegador foi realmente projetada para fazer.

Perguntas Frequentes

Não de forma confiável. No início de 2026, Firefox e Chrome implementaram suporte, mas a API ainda é um recurso de disponibilidade limitada e não faz parte da plataforma web Baseline. Para aplicações de produção, use detecção de recursos para verificar Element.prototype.setHTML e recorra a uma biblioteca como DOMPurify quando a API não estiver disponível. Isso lhe dá sanitização nativa onde houver suporte, mantendo a segurança em todos os lugares.

setHTML sempre impõe uma política básica segura contra XSS. Remove tags de script, atributos manipuladores de eventos e URLs perigosas independentemente da sua configuração. setHTMLUnsafe aplica apenas a configuração do sanitizador que você fornecer, sem essa rede de segurança. Use setHTMLUnsafe apenas quando precisar explicitamente permitir elementos ou atributos que o método seguro bloquearia.

Ainda não. O DOMPurify permanece necessário como alternativa para navegadores que não possuem suporte à API Sanitizer. Mesmo quando a cobertura dos navegadores for universal, o DOMPurify oferece opções de configuração mais granulares que alguns projetos podem precisar. Com o tempo, porém, a API nativa deve lidar com a maioria dos casos de uso de sanitização sem exigir uma dependência de terceiros.

Uma configuração de permissão especifica exatamente quais elementos e atributos são permitidos e descarta todo o resto. Uma configuração de remoção especifica o que remover e permite tudo que não estiver explicitamente listado. Configurações de permissão são geralmente mais seguras porque, por padrão, bloqueiam elementos desconhecidos ou novos em vez de acidentalmente permiti-los.

Complete picture for complete understanding

Capture every clue your frontend is leaving so you can instantly get to the root cause of any issue with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data.

Check our GitHub repo and join the thousands of developers in our community.

OpenReplay