(Ersetzt) Experimente mit einer 'strict-dynamic'-Content Security Policy (CSP)

Wir experimentieren mit einer neuen ‘strict-dynamic’-CSP, die es einfacher machen sollte, Themes, Plugins und externe Skripte sicher in Discourse zu integrieren.

Sie können den neuen Modus ausprobieren, indem Sie die Website-Einstellung ‘content security policy strict dynamic’ aktivieren. Bitte geben Sie uns Feedback, wenn Sie welches haben!

Wir hoffen, dies in naher Zukunft zum Standard zu machen und werden einen #announcements-Thread erstellen, wenn wir diesem Ziel näher kommen.

Weitere Informationen finden Sie unten:


:scroll: Hintergrund

Bereits 2018 führten wir eine standardmäßige Content Security Policy für Discourse ein. Damals bedeutete unsere Browser-Support-Richtlinie, dass wir auf die Verwendung von ‘host-source’-Werten beschränkt waren (d. h. das Auflisten von URL-Präfixen für jedes Skript, das erlaubt sein sollte).

Hier im Jahr 2024 gibt es mehr Optionen: nämlich das Schlüsselwort 'strict-dynamic'. Dies beseitigt die Notwendigkeit, alle Skript-URLs im Voraus aufzulisten. Stattdessen dürfen anfänglich vertrauenswürdige Skripte (über einen ‘hash’- oder ‘nonce’-Wert) weitere Skripte mit minimalen Einschränkungen laden.

:eyes: Wie kann ich diesen neuen Modus ausprobieren?

Aktivieren Sie die Einstellung „content security policy strict dynamic“ in Ihrem Admin-Panel.

Wenn Sie die Einstellung nicht sehen, stellen Sie sicher, dass Sie die neueste Version von Discourse ausführen. Das neue Feature wurde am 16. Februar zusammengeführt (während des 3.3.0.beta1-dev-Zyklus).

Wenn Sie unseren Hosting-Service nutzen und das Update beschleunigen möchten, lassen Sie es uns einfach wissen!

:thinking: Was passiert, wenn ich die neue Einstellung aktiviere?

Die Content-Security-Policy script-src-Direktive wird aktualisiert, um einen einzelnen nonce--Wert und das Schlüsselwort 'strict-dynamic' zu enthalten.

Alle anfänglichen \u003cscript\u003e-Tags im Kern und in Themes erhalten automatisch das entsprechende nonce=-Attribut. Es sind keine zusätzlichen Arbeiten von Administratoren oder Theme-Entwicklern erforderlich.

Plugins, die ihre eigenen benutzerdefinierten \u003cscript\u003e-Tags injizieren, müssen aktualisiert werden, um diesen neuen Modus zu unterstützen (z. B.). Wir sammeln Daten darüber, wie weit verbreitet dies ist, und werden bei Bedarf Anleitungen für Entwickler bereitstellen.

Alle von Themes oder Plugins bereitgestellten Host-Source-Werte werden automatisch ignoriert (Browser unterstützen Host-Source nicht neben strict-dynamic).

:technologist: Was ist mit externen Skripten wie GTM, Analysen, Werbung usw.?

Sie sollten ‘einfach funktionieren’, ohne zusätzliche Konfiguration erforderlich. Lassen Sie uns wissen, wenn Sie auf Probleme stoßen!

:recycle: Ist es umkehrbar?

Ja! Während wir das Experiment durchführen, können Sie die Einstellung ein- und ausschalten, und die Änderung wird sofort wirksam.

:writing_hand: Beispielrichtlinien

Beispiel für eine Discourse-Richtlinie vor dieser Änderung:

upgrade-insecure-requests;
base-uri 'self';
object-src 'none';
script-src https://meta.discourse.org/logs/ https://meta.discourse.org/sidekiq/ https://meta.discourse.org/mini-profiler-resources/ https://d11a6trkgmumsb.cloudfront.net/assets/ https://meta.discourse.org/extra-locales/ https://d3bpeqsaub0i6y.cloudfront.net/highlight-js/ https://d3bpeqsaub0i6y.cloudfront.net/javascripts/ https://d3bpeqsaub0i6y.cloudfront.net/plugins/ https://d3bpeqsaub0i6y.cloudfront.net/theme-javascripts/ https://d3bpeqsaub0i6y.cloudfront.net/svg-sprite/ 'sha256-8uAKDaK4QxxCeYZl0Wxad2Nnj2tgKyA14hYBh66pnn0=' 'sha256-QFlnYO2Ll+rgFRKkUmtyRublBc7KFNsbzF7BzoCqjgA=';
worker-src 'self' https://d11a6trkgmumsb.cloudfront.net/assets/ https://d3bpeqsaub0i6y.cloudfront.net/javascripts/ https://d3bpeqsaub0i6y.cloudfront.net/plugins/;
frame-ancestors 'self';
manifest-src 'self';

Beispiel für eine Discourse-Richtlinie nach dieser Änderung:

upgrade-insecure-requests;
base-uri 'self';
object-src 'none';
script-src 'nonce-78uQrKOCg78iGuMAwCq2lI9E7' 'strict-dynamic';
frame-ancestors 'self';
manifest-src 'self';

:open_book: Ressourcen

MDN strict-dynamic docs

Googles Dokumentation zu ‘Strict CSP’

CSP Evaluator

Caniuse Browser Support Info

22 „Gefällt mir“

Da der strict-dynamic CSP ab Discourse v3.3.0.beta3 nicht mehr optional ist, haben wir Mitigate XSS Attacks with Content Security Policy aktualisiert und dieses Thema wird geschlossen.

2 „Gefällt mir“