flawopen.com/XSS/Renderização de Markdown
Markdown é seguro contra XSS?
Trate o HTML gerado a partir de Markdown como conteúdo não confiável. Um parser pode preservar HTML bruto porque a sintaxe permite isso; converter Markdown não sanitiza a saída. Pense no parser como um tradutor que copia fielmente a marcação, não como um guarda de segurança.
Onde fica o limite de confiança
A especificação CommonMark define que HTML bruto com formato de tag é renderizado sem escape. O comportamento real depende do parser, das opções, dos plugins e do framework. O Marked, por exemplo, avisa explicitamente que não sanitiza o HTML gerado. A sintaxe Markdown não comprova que a entrada é segura; o sanitizador precisa corresponder ao destino final do HTML.
Fluxo seguro de renderização
const html = marked.parse(userMarkdown); container.innerHTML = html; // saída do parser não foi sanitizada
import DOMPurify from "dompurify";
const html = marked.parse(userMarkdown);
container.innerHTML = DOMPurify.sanitize(html, {
USE_PROFILES: { html: true }
});
O exemplo usa o perfil somente HTML do DOMPurify porque esta visualização não precisa de SVG ou MathML. Escolha o menor conjunto de recursos necessário. Não altere a marcação sanitizada nem a passe por outra biblioteca que transforme HTML antes da inserção: isso pode invalidar as garantias. Prefira a renderização segura de texto do framework quando HTML rico não for necessário. Use Content Security Policy e Trusted Types como defesa adicional, não como substitutos da sanitização.
Revisão de produção
- ✓Fixe a versão do parser Markdown e revise as opções de HTML bruto, plugins e URLs.
- ✓Sanitize o HTML final gerado com um sanitizador de allowlist mantido, imediatamente antes do destino HTML.
- ✓Restrinja elementos, atributos e protocolos de URL aos recursos necessários.
- ✓Não edite nem reinterprete a marcação após a sanitização; se uma transformação for necessária, sanitize novamente.
- ✓Teste a configuração exata do parser e o destino de renderização, mantendo o sanitizador atualizado.
Perguntas frequentes
Isso remove um recurso de entrada, mas não comprova segurança por si só. Revise links, imagens, extensões, o HTML gerado e o contexto final; sanitize a saída ao inseri-la como HTML.
Evite. Alterações posteriores podem introduzir marcação insegura ou invalidar as decisões do sanitizador. Faça as transformações antes e sanitize por último.
Não. Use-o para fragmentos HTML conforme o modelo de ameaças documentado, mantenha-o atualizado, adote uma política restrita e não reutilize a saída em contextos como strings JavaScript ou CSS.
Referências
- Especificação CommonMark — HTML bruto
- Documentação do Marked — aviso de segurança
- DOMPurify — README e uso
- OWASP — prevenção de Cross-Site Scripting
- flawopen.com — Cross-Site Scripting