flawopen.com/XSS em JavaScript/dangerouslySetInnerHTML
dangerouslySetInnerHTML do React é seguro?
Pense no JSX comum como uma impressora de etiquetas: texto continua sendo texto. dangerouslySetInnerHTML troca isso por uma prensa que interpreta a string como HTML. Se ela contiver conteúdo controlado por um invasor, o navegador poderá tratá-lo como marcação ativa. Use esse ponto apenas com HTML deliberadamente confiável ou sanitizado para o contexto HTML exato.
Por que o JSX comum não precisa disso
function Comment({ html }) {
return <p dangerouslySetInnerHTML=
{{ __html: html }} />;
}
function Comment({ text }) {
return <p>{text}</p>;
}
Quando dangerouslySetInnerHTML é apropriado?
Use-o somente quando o produto precisar preservar um formato restrito de rich text que não possa ser representado como filhos React comuns. Um CMS, editor ou renderizador Markdown não é confiável automaticamente: conteúdo armazenado e saída do renderizador ainda podem conter marcação não confiável. Defina os elementos e atributos permitidos, sanitize com uma biblioteca mantida como DOMPurify e envie o resultado sanitizado diretamente para esse ponto.
Como usar com segurança
Sanitize imediatamente antes de atribuir o valor a dangerouslySetInnerHTML, usando uma biblioteca mantida como DOMPurify. Não use expressões regulares como sanitizador HTML. Evite alterar a string depois da sanitização; uma transformação posterior pode invalidar as garantias do sanitizador. Mantenha a biblioteca e o ambiente de análise atualizados.
Uma lista de bloqueio de tags conhecidas é incompleta: o risco também pode vir de atributos, campos com URLs, namespaces e comportamento do parser. Escolha uma pequena lista de elementos e atributos necessários ao recurso e configure o sanitizador para essa política. Revise links e outros atributos de URL separadamente, conforme os destinos permitidos pelo produto.
Como verificar seu código
grep -rn "dangerouslySetInnerHTML" --include="*.jsx" --include="*.tsx" .Perguntas frequentes
Depende do renderizador e de sua configuração. Verifique se ele aceita HTML bruto e se sanitiza a saída; não presuma que a conversão de Markdown, por si só, torne o HTML seguro.
Sim. O v-html também entrega HTML ao navegador sem a interpolação de texto comum do framework. Trate o valor como um ponto de entrada HTML e sanitize conteúdo não confiável conforme uma política adequada.
Referências
- Documentação do React — dangerouslySetInnerHTML
- DOMPurify — sanitizador HTML e notas de uso
- MDN — considerações de segurança de Element.innerHTML
- flawopen.com — XSS em JavaScript