(Soppiantato) Sperimentando con una Content Security Policy (CSP) 'strict-dynamic'

Stiamo sperimentando una nuova CSP ‘strict-dynamic’, che dovrebbe semplificare notevolmente l’integrazione di temi, plugin e script esterni con Discourse in modo sicuro.

Puoi provare la nuova modalità abilitando l’impostazione del sito ‘content security policy strict dynamic’. Facci sapere se hai feedback!

Speriamo di renderla predefinita nel prossimo futuro e pubblicheremo un argomento Announcements man mano che ci avvicineremo a tale obiettivo.

Per maggiori informazioni, vedi sotto:


:scroll: Contesto

Nel 2018 abbiamo introdotto una Content Security Policy predefinita per Discourse. All’epoca, la nostra policy di supporto ai browser ci imponeva di utilizzare valori ‘host-source’ (ovvero, elencare i prefissi URL per ogni script che doveva essere consentito).

Qui nel 2024, ci sono più opzioni disponibili: in particolare, la parola chiave 'strict-dynamic'. Questo rimuove la necessità di elencare tutti gli URL degli script in anticipo. Invece, qualsiasi script inizialmente attendibile (tramite un valore ‘hash’ o ‘nonce’) può caricare altri script con restrizioni minime.

:eyes: Come posso provare questa nuova modalità?

Abilita l’impostazione ‘content security policy strict dynamic’ nel tuo pannello di amministrazione.

Se non vedi l’impostazione, assicurati di eseguire l’ultima versione di Discourse. La nuova funzionalità è stata unita il 16 febbraio (durante il ciclo 3.3.0.beta1-dev).

Se sei sul nostro hosting e desideri accelerare l’aggiornamento, faccelo sapere!

:thinking: Cosa succede quando abilito la nuova impostazione?

La direttiva script-src di Content-Security-Policy verrà aggiornata per includere un singolo valore nonce- e la parola chiave 'strict-dynamic'.

Tutti i tag <script> iniziali nel core e nei temi riceveranno automaticamente l’attributo nonce= appropriato. Non è richiesto alcun lavoro aggiuntivo da parte degli amministratori o degli sviluppatori di temi.

I plugin che iniettano i propri tag <script> personalizzati dovranno essere aggiornati per supportare questa nuova modalità (ad esempio). Stiamo lavorando per raccogliere dati su quanto sia diffuso questo problema e forniremo indicazioni agli sviluppatori, se necessario.

Qualsiasi valore host-source fornito da temi o plugin verrà automaticamente ignorato (i browser non supportano host-source insieme a strict-dynamic).

:technologist: E per gli script esterni come GTM, analytics, pubblicità, ecc.?

Dovrebbero funzionare ‘senza problemi’, senza alcuna configurazione aggiuntiva richiesta. Facci sapere se riscontri problemi!

:recycle: È reversibile?

Sì! Mentre stiamo eseguendo l’esperimento, puoi attivare e disattivare l’impostazione e la modifica avrà effetto immediato.

:writing_hand: Esempi di policy

Esempio di policy Discourse prima di questa modifica:

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';

Esempio di policy Discourse dopo questa modifica:

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

:open_book: Risorse

Documentazione MDN strict-dynamic

Documentazione di Google ‘Strict CSP’

Valutatore CSP

Informazioni sul supporto browser Caniuse

22 Mi Piace

Poiché la CSP strict-dynamic è non opzionale da Discourse v3.3.0.beta3 in poi, abbiamo aggiornato Mitigate XSS Attacks with Content Security Policy e questo argomento verrà chiuso.

2 Mi Piace