XSS-Angriffe mit Content Security Policy eindämmen

:bookmark: Diese Anleitung erklärt, wie Sie Content Security Policy (CSP) verwenden, um Cross-Site-Scripting-Angriffe (XSS) in Discourse zu mindern. Sie behandelt die Grundlagen von CSP, die Konfiguration und bewährte Verfahren.

:person_raising_hand: Erforderliche Benutzerstufe: Administrator

Zusammenfassung

Content Security Policy (CSP) ist ein entscheidendes Sicherheitsfeature in Discourse, das zum Schutz vor Cross-Site-Scripting (XSS) und anderen Injektionsangriffen beiträgt. Diese Anleitung behandelt die Grundlagen von CSP, deren Umsetzung in Discourse und die Konfiguration für Ihre Seite.

Was ist Content Security Policy?

Content Security Policy ist eine zusätzliche Sicherheitsebene, die hilft, bestimmte Angriffsarten zu erkennen und zu mindern, darunter Cross-Site-Scripting (XSS) und Dateninjektionsangriffe. CSP funktioniert, indem festgelegt wird, welche Inhaltsquellen als vertrauenswürdig gelten, und der Browser angewiesen wird, Ressourcen nur von diesen vertrauenswürdigen Quellen auszuführen oder darzustellen.

XSS bleibt eine der häufigsten Schwachstellen im Web. Durch die Implementierung von CSP erlaubt Discourse das Laden und Ausführen von Skripten nur aus vertrauenswürdigen Quellen, was das Risiko von XSS-Angriffen erheblich verringert.

CSP-Implementierung in Discourse

Ab Discourse-Version 3.3.0.beta1 implementiert Discourse eine CSP mit „strict-dynamic". Dieser Ansatz verwendet einen einzigen nonce--Wert und das Schlüsselwort strict-dynamic in der Direktive script-src. Alle initialen <script>-Tags im Kern und in Themes erhalten automatisch das entsprechende Attribut nonce=.

Die Standardrichtlinie umfasst folgende Direktiven:

  • script-src: Legt gültige Quellen für JavaScripts fest
  • worker-src: Legt gültige Quellen für ServiceWorker-Skripte fest
  • object-src: Blockiert die Ausführung von Plugins (Flash, Java usw.)
  • base-uri: Beschränkt die URLs für <base>-Elemente
  • manifest-src: Beschränkt die URLs für Web-App-Manifeste
  • frame-ancestors: Steuert, welche Seiten Ihre Discourse-Instanz in einem iframe einbetten können
  • upgrade-insecure-requests: Aktualisiert HTTP-Anfragen automatisch auf HTTPS (enthaltet, wenn force_https aktiviert ist)

CSP in Discourse konfigurieren

Verfügbare Einstellungen

  • content_security_policy: Aktiviert oder deaktiviert CSP (Standard: an)
  • content_security_policy_report_only: Aktiviert den CSP Report-Only-Modus (Standard: aus)
  • content_security_policy_script_src: Ermöglicht die Erweiterung der Standard-script-src-Direktive
  • content_security_policy_frame_ancestors: Aktiviert die frame_ancestors-Direktive (Standard: an)

So aktivieren Sie CSP

  1. Navigieren Sie zu Ihrem Admin-Bereich.
  2. Gehen Sie zu den Sicherheitseinstellungen.
  3. Suchen Sie die Einstellung content_security_policy und stellen Sie sicher, dass sie aktiviert ist.

Es wird empfohlen, zunächst den CSP Report-Only-Modus zu verwenden, um potenzielle Probleme zu identifizieren, bevor Sie CSP vollständig aktivieren:

  1. Aktivieren Sie die Einstellung content_security_policy_report_only.
  2. Überwachen Sie die Browserkonsole auf CSP-Verletzungen.
  3. Beheben Sie legitime Verletzungen, indem Sie die CSP bei Bedarf erweitern.
  4. Sobald Sie sicher sind, dass es keine falschen Positivmeldungen gibt, deaktivieren Sie den Report-Only-Modus und aktivieren Sie CSP vollständig.

Erweiterung der Standard-CSP

Wenn Sie zusätzliche Skriptquellen zulassen müssen, können Sie die script-src-Direktive mit der Einstellung content_security_policy_script_src erweitern. Sie können hinzufügen:

  • Hash-Quellen
  • 'wasm-unsafe-eval'
  • 'unsafe-eval' (mit Vorsicht verwenden)

Beispiel:

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

:warning: Seien Sie vorsichtig beim Hinzufügen von 'unsafe-eval' oder anderen zulässigen Direktiven, da dies die Wirksamkeit von CSP verringern kann.

CSP und Integrationen von Drittanbietern

Bei der Verwendung von Diensten von Drittanbietern wie Google Tag Manager, Google Analytics oder Werbediensten müssen Sie möglicherweise Ihre CSP-Einstellungen anpassen. In den meisten Fällen mit Discourse-Version 3.3.0.beta1 oder höher funktionieren externe Skripte aufgrund der „strict-dynamic"-CSP-Implementierung ohne zusätzliche Konfiguration.

Wenn Sie auf Probleme stoßen, müssen Sie möglicherweise:

  1. Die erforderlichen Skriptquellen identifizieren, indem Sie die Browserkonsole überwachen.
  2. Die erforderlichen Quellen zur Einstellung content_security_policy_script_src hinzufügen.
  3. Bei komplexen Integrationen wie Werbediensten, die externe Ressourcen laden, die cross-domain-Rendering-Funktion aktivieren (Beispiel-PR von discourse-adplugin, die dies umsetzt).

Bewährte Verfahren

  1. Beginnen Sie mit dem CSP Report-Only-Modus, um potenzielle Probleme zu identifizieren.
  2. Verschärfen Sie Ihre CSP schrittweise, während Sie legitime Verletzungen beheben.
  3. Überprüfen Sie regelmäßig Ihre CSP-Einstellungen und passen Sie sie bei Bedarf an.
  4. Seien Sie vorsichtig beim Hinzufügen zulässiger Direktiven wie 'unsafe-eval' oder 'wasm-unsafe-eval'.
  5. Halten Sie Ihre Discourse-Instanz auf dem neuesten Stand, um von den neuesten CSP-Verbesserungen zu profitieren.

Häufig gestellte Fragen (FAQs)

F: Ich sehe viele CSP-Verletzungsberichte. Sollte ich besorgt sein?
A: Viele CSP-Verletzungen sind falsche Positivmeldungen, die oft durch Browsererweiterungen oder andere nicht zusammenhängende Skripte verursacht werden. Konzentrieren Sie sich auf die Behebung von Verletzungen, die sich auf die Funktionalität Ihrer Seite beziehen.

F: Kann ich CSP mit Google AdSense oder anderen Werbenetzwerken verwenden?
A: Ja, aber Sie müssen möglicherweise zulässigere CSP-Einstellungen verwenden. Beginnen Sie mit dem Report-Only-Modus und passen Sie Ihre Einstellungen basierend auf den gemeldeten Verletzungen an.

F: Wie behebe ich CSP-Probleme?
A: Verwenden Sie die Entwicklertools Ihres Browsers, um die Konsole auf CSP-Verletzungsmeldungen zu überwachen. Diese helfen Ihnen zu identifizieren, welche Ressourcen blockiert werden und warum.

Zusätzliche Ressourcen

56 „Gefällt mir“
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