FlawOpen

flawopen.com/XSS/Renderizado de Markdown

¿Markdown es seguro frente a XSS?

Guía de referencia
Respuesta breve

Trata el HTML generado desde Markdown como contenido no confiable. Un parser puede conservar HTML sin procesar porque la sintaxis lo permite; convertir Markdown no sanea la salida. El parser es un traductor que copia el marcado, no un guardia de seguridad.

Dónde está el límite de confianza

La especificación CommonMark indica que el HTML sin procesar con forma de etiqueta se representa sin escaparlo. El comportamiento depende del parser, sus opciones, complementos y el framework. Marked, por ejemplo, advierte que no sanea el HTML generado. La sintaxis Markdown no demuestra que la entrada sea segura; el saneador debe proteger el destino HTML final.

Un flujo de renderizado seguro

INSEGURO — insertar salida no confiable
const html = marked.parse(userMarkdown);
container.innerHTML = html; // la salida no está saneada
PROTEGIDO — sanear justo antes del destino HTML
import DOMPurify from "dompurify";

const html = marked.parse(userMarkdown);
container.innerHTML = DOMPurify.sanitize(html, {
  USE_PROFILES: { html: true }
});

El ejemplo usa el perfil HTML de DOMPurify porque esta vista no necesita SVG ni MathML. Limita las funciones a las que necesita tu producto. No modifiques el marcado saneado ni lo pases por otra biblioteca que transforme HTML antes de insertarlo: eso puede invalidar las garantías. Si no necesitas HTML enriquecido, usa la salida de texto segura del framework. Content Security Policy y Trusted Types son defensas adicionales, no sustitutos del saneamiento.

Revisión para producción

Preguntas frecuentes

¿Desactivar HTML sin procesar vuelve seguro Markdown?

Elimina una función de entrada, pero no garantiza la seguridad. Revisa enlaces, imágenes, extensiones, HTML generado y contexto de inserción; sanea la salida al usarla como HTML.

¿Puedo modificar el HTML después de sanearlo?

Evítalo. Los cambios posteriores pueden introducir marcado inseguro o invalidar las decisiones del saneador. Haz las transformaciones primero y sanea al final.

¿DOMPurify hace segura cualquier salida en todo contexto?

No. Úsalo para fragmentos HTML según su modelo de amenazas, mantenlo actualizado, aplica una política acotada y no reutilices la salida como cadena JavaScript o CSS.

Referencias

Véase también Cross-Site Scripting (XSS, CWE-79): cómo funciona y cómo evitarlo en cada lenguaje — flawopen.com ¿Svelte protege contra XSS por defecto? ¿La carga de SVG implica riesgo de XSS? Riesgo de XSS con Vue v-html WKWebView: ¿HTML no confiable seguro? XSS reflejado, almacenado y basado en DOM: ¿en qué se diferencian? Riesgos de seguridad de addJavascriptInterface en Android