Atténuer les attaques XSS avec la Content Security Policy

:bookmark: Ce guide explique comment utiliser la Politique de Sécurité du Contenu (CSP) pour atténuer les attaques de type Cross-Site Scripting (XSS) dans Discourse. Il couvre les bases de la CSP, sa configuration et les meilleures pratiques.

:person_raising_hand: Niveau d’utilisateur requis : Administrateur

Résumé

La Politique de Sécurité du Contenu (CSP) est une fonctionnalité de sécurité cruciale dans Discourse qui aide à se protéger contre les attaques de type Cross-Site Scripting (XSS) et autres attaques par injection. Ce guide présente les bases de la CSP, son implémentation dans Discourse et la façon de la configurer pour votre site.

Qu’est-ce que la Politique de Sécurité du Contenu ?

La Politique de Sécurité du Contenu est une couche de sécurité supplémentaire qui aide à détecter et à atténuer certains types d’attaques, notamment les attaques de type Cross-Site Scripting (XSS) et les attaques par injection de données. La CSP fonctionne en spécifiant quelles sources de contenu sont considérées comme fiables et en instruisant le navigateur à n’exécuter ou à rendre que les ressources provenant de ces sources fiables.

Le XSS reste l’une des vulnérabilités web les plus courantes. En mettant en œuvre la CSP, Discourse autorise uniquement le chargement et l’exécution de scripts provenant de sources fiables, réduisant ainsi considérablement le risque d’attaques XSS.

Implémentation de la CSP dans Discourse

À partir de la version 3.3.0.beta1 de Discourse, Discourse implémente une CSP de type ‘strict-dynamic’. Cette approche utilise une seule valeur nonce- et le mot-clé strict-dynamic dans la directive script-src. Toutes les balises <script> initiales dans le cœur et les thèmes se voient automatiquement attribuer l’attribut nonce= approprié.

La politique par défaut inclut les directives suivantes :

  • script-src : Spécifie les sources valides pour les scripts JavaScript
  • worker-src : Spécifie les sources valides pour les scripts ServiceWorker
  • object-src : Bloque l’exécution des plugins (Flash, Java, etc.)
  • base-uri : Restreint les URLs pour les éléments <base>
  • manifest-src : Restreint les URLs pour les manifestes d’applications web
  • frame-ancestors : Contrôle quels sites peuvent intégrer votre instance Discourse dans une iframe
  • upgrade-insecure-requests : Met automatiquement à niveau les requêtes HTTP vers HTTPS (inclus lorsque force_https est activé)

Configuration de la CSP dans Discourse

Paramètres disponibles

  • content_security_policy : Active ou désactive la CSP (par défaut : activé)
  • content_security_policy_report_only : Active le mode Rapport-Only de la CSP (par défaut : désactivé)
  • content_security_policy_script_src : Vous permet d’étendre la directive script-src par défaut
  • content_security_policy_frame_ancestors : Active la directive frame_ancestors (par défaut : activé)

Comment activer la CSP

  1. Accédez à votre panneau d’administration
  2. Allez dans les paramètres de sécurité
  3. Trouvez le paramètre content_security_policy et assurez-vous qu’il est activé

Il est recommandé de commencer par le mode Rapport-Only de la CSP pour identifier d’éventuels problèmes avant d’activer complètement la CSP :

  1. Activez le paramètre content_security_policy_report_only
  2. Surveillez la console de votre navigateur pour les violations de la CSP
  3. Résolvez les violations légitimes en étendant la CSP si nécessaire
  4. Une fois que vous êtes certain qu’il n’y a pas de faux positifs, désactivez le mode Rapport-Only et activez complètement la CSP

Étendre la CSP par défaut

Si vous devez autoriser des sources de scripts supplémentaires, vous pouvez étendre la directive script-src en utilisant le paramètre content_security_policy_script_src. Vous pouvez ajouter :

  • Des sources basées sur des hachages
  • 'wasm-unsafe-eval'
  • 'unsafe-eval' (à utiliser avec prudence)

Par exemple :

'sha256-QFlnYO2Ll+rgFRKkUmtyRublBc7KFNsbzF7BzoCqjgA=' 'unsafe-eval'

:warning: Soyez prudent lors de l’ajout de 'unsafe-eval' ou d’autres directives permissives, car elles peuvent réduire l’efficacité de la CSP.

CSP et intégrations tierces

Lors de l’utilisation de services tiers comme Google Tag Manager, Google Analytics ou des services publicitaires, vous devrez peut-être ajuster vos paramètres de CSP. Dans la plupart des cas avec la version 3.3.0.beta1 de Discourse ou ultérieure, les scripts externes devraient fonctionner sans configuration supplémentaire grâce à l’implémentation de la CSP ‘strict-dynamic’.

Si vous rencontrez des problèmes, vous devrez peut-être :

  1. Identifier les sources de scripts requises en surveillant la console de votre navigateur
  2. Ajouter les sources nécessaires au paramètre content_security_policy_script_src
  3. Pour des intégrations complexes comme les services publicitaires qui chargent des ressources externes, vous devrez peut-être activer le rendu inter-domaines (Exemple de PR de discourse-adplugin qui le fait).

Meilleures pratiques

  1. Commencez par le mode Rapport-Only de la CSP pour identifier d’éventuels problèmes
  2. Renforcez progressivement votre CSP au fur et à mesure que vous résolvez les violations légitimes
  3. Passez régulièrement en revue vos paramètres de CSP et ajustez-les si nécessaire
  4. Soyez prudent lors de l’ajout de directives permissives comme 'unsafe-eval' ou 'wasm-unsafe-eval'
  5. Maintenez votre instance Discourse à jour pour bénéficier des dernières améliorations de la CSP

FAQ

Q : Je vois de nombreux rapports de violation de la CSP. Dois-je m’inquiéter ?
R : De nombreuses violations de la CSP sont des faux positifs, souvent causés par des extensions de navigateur ou d’autres scripts sans rapport. Concentrez-vous sur la résolution des violations liées au fonctionnement de votre site.

Q : Puis-je utiliser la CSP avec Google AdSense ou d’autres réseaux publicitaires ?
R : Oui, mais vous devrez peut-être utiliser des paramètres de CSP plus permissifs. Commencez par le mode Rapport-Only et ajustez vos paramètres en fonction des violations signalées.

Q : Comment dépanner les problèmes de CSP ?
R : Utilisez les outils de développement de votre navigateur pour surveiller la console en quête de messages de violation de la CSP. Ils vous aideront à identifier quelles ressources sont bloquées et pourquoi.

Ressources supplémentaires

56 « J'aime »
Adsense Not Working after Recent Discourse Update
Discourse 2.2.0.beta6 Release Notes
Adding statcounter code
How to restart Discourse after server reboot?
How to install npm packages in custom themes/plugins
Interactive SVG using <object>?
Video Upload to YouTube and Vimeo using Theme Component
Embed HTML5 player for MP3 file
2.5.0.beta5 breaks retort plugin
Should I load third-party libraries from vendor or cdn?
Word Cloud plugin
Embed widget within text in a topic
Discourse Intercom (Advanced)
"Unsafe JavaScript attempt to initiate navigation"
Google Tag Manager and Discourse CSP (Content Security Policy)
Cookie Consent, GDPR, and Discourse
A strange question about google ad display in my site
How to pass a component setting as a value to an attribute?
Need help integrating code wrote on Edittext to the Discourse
Issue with Activate Account Page After Update to 3.4.0 (Blank Page)
Any approved method for adding Javascript before body close?
(Superseded) Experimenting with a 'strict-dynamic' Content Security Policy (CSP)
Can't get script tag to work in landing pages plugin due to content-security-policy
How to embed Razorpay subscription button with CSP restrictions
Push custom events to Google Tag Manager and Analytics
Can I add a snippet to the header?
JS script is not loading
How do we fire scripts after topic HTML is rendered in DOM?
Iframe issue without URL
Where to place ad script?
We couldn't find the code on your site
Javascript not working in customised areas
Difficulties in correctly adding external JavaScript
Report Only CSP Violations
Nginx config in Discourse Docker?
EPN Smart Links
Discourse 2.2.0.beta9 Release Notes
"Refused to load the script" when adding adsense
Why Cookie Consent Doesn't Show Up?
[DigitalOcean] hostname having "www" in A records showing blank page
[DigitalOcean] hostname having "www" in A records showing blank page
Communities with embedded Twitter Feeds
How to add analytics and pixel scripts avoiding Content Security Policy (XSS)
When install html script facing issue?
Discourse 2.4.0.beta10 Release Notes
Add CSP sources to the plugin
IP does not redirect to domain, domain shows white page
DISCOURSE_CDN_URL causes content security policy violations?
Header content is missing due to CSP
How to insert something right after <head>?
How can I embed tracking JS into Discourse
How do I integrate ? cookiebot.com in meinen Forum?
Adding Cookie Consent Banner
Confused about remotely loaded javascript content
User input validation
Custom JS script in theme component not loading