No artigo, Frederik argumenta que sanitizadores conhecidos como o renomado DOMPurify, que por mais que seja uma dor de cabeça para os hackers que tentam explorar um simples XSS, ainda assim pode ter vulnerabilidades como, por exemplo, abrindo canais para o mXSS.
O mXSS é quando ocorre uma mutação, isso é, a string do XSS de entrada, quando o próprio navegador vai fazer o parsing da DOM tree acaba sendo alterada.
Isso acontece porque o método antigo exige uma dupla análise (parsing) do HTML (sanitizar e depois inserir) e a serialização de string no meio.
Essa instabilidade de contexto permite que o código malicioso se ative no segundo parsing.
O setHTML() se diferencia por eliminar a string intermediária sanitizada, garantindo que a análise e a sanitização ocorram em um único passo interno e contextualizado (o objeto DOM é o contexto) antes da inserção.
Exemplo Antigo (Inseguro):
const limpo = DOMPurify.sanitize(input); elemento.innerHTML = limpo;Exemplo Novo (Seguro):
elemento.setHTML(input);Se precisar de configuração, você a passa diretamente:
const s = new Sanitizer({ allowElements: ['h1'] }); elemento.setHTML(input, { sanitizer: s });Artigo: https://frederikbraun.de/why-sethtml.html