flawopen.com/XSS in JavaScript/DOMPurify and innerHTML
DOMPurify basta para tornar innerHTML seguro?
DOMPurify é um sanitizador forte baseado em lista de permissões para HTML rico quando sua saída vai diretamente a um ponto de inserção HTML, sem alterações posteriores. Pense numa encomenda inspecionada na doca: se outro processo a reembalar ou usar outra entrada, a inspeção inicial já não cobre o que chega. Para texto simples, use textContent e evite interpretar HTML.
// Sanitizado ao salvar com uma versão/política antiga. saveToDb(DOMPurify.sanitize(input)); // O código posterior confia na string salva sem verificar. el.innerHTML = fetchedFromDb;
// Para HTML rico, sanitize com a biblioteca atual // imediatamente antes de inserir no contexto HTML. el.innerHTML = DOMPurify.sanitize(untrustedHtml, { USE_PROFILES: { html: true }, }); // Se for texto simples, não o interprete como HTML. textNode.textContent = untrustedText;
Por que sanitizar uma vez na entrada é um padrão mais fraco
Sanitizar ao salvar não é automaticamente inseguro, mas cria uma fronteira com dados antigos: um renderizador pode confiar em saída antiga após uma correção do sanitizador, mudança de política ou caminho que pulou a sanitização. Sanitize novamente no momento da renderização com a versão atual e a política do destino exato. Não modifique nem passe a marcação limpa por outra biblioteca antes de inseri-la; o pós-processamento pode invalidar a sanitização.
A configuração e o contexto de saída importam
A configuração padrão do DOMPurify permite HTML, SVG e MathML. Se o recurso só precisa de HTML, restrinja o perfil com USE_PROFILES: { html: true }. Não amplie tags ou atributos sem revisão. DOMPurify não sanitiza CSS nem impede toda requisição externa; use a saída apenas em HTML, nunca em JavaScript, atributo, XML, SVG ou CSS.
Trusted Types e renderização no servidor
Quando houver suporte, imponha Trusted Types com Content Security Policy para rejeitar strings em pontos de inserção HTML sem uma política aprovada. DOMPurify pode produzir TrustedHTML; isso reduz usos acidentais do destino, mas não corrige configuração insegura nem pós-processamento. No servidor, DOMPurify depende de uma implementação DOM: mantenha jsdom atualizado e não o combine com happy-dom para sanitização sensível à segurança.
Checklist de produção
- ✓Use textContent para texto simples. Use DOMPurify somente quando o produto precisar renderizar um subconjunto controlado de HTML rico.
- ✓Sanitize no destino HTML final com a versão atual do DOMPurify e uma lista mínima revisada; não altere a marcação resultante.
- ✓Mantenha a saída HTML no contexto HTML. Não a reutilize em JavaScript, CSS, atributo, XML, SVG ou outro parser.
- ✓Revise em conjunto setConfig() persistente, hooks, ADD_TAGS/ADD_ATTR, versões do DOM no servidor e políticas/CSP de Trusted Types.
Busque pontos de inserção HTML
rg -n -g '*.{js,ts,jsx,tsx}' '(innerHTML|outerHTML|insertAdjacentHTML|document\.write|dangerouslySetInnerHTML)' .Fontes e referências
- DOMPurify — README e configuração
- DOMPurify — objetivos e modelo de ameaça
- OWASP — prevenção de XSS baseado em DOM
- OWASP — segurança em JavaScript e TypeScript
- FlawOpen — XSS em JavaScript