Mitigare gli attacchi XSS con Content Security Policy

:bookmark: Questa guida spiega come utilizzare la Content Security Policy (CSP) per mitigare gli attacchi di Cross-Site Scripting (XSS) in Discourse. Copre le basi della CSP, la configurazione e le migliori pratiche.

:person_raising_hand: Livello utente richiesto: Amministratore

Riepilogo

La Content Security Policy (CSP) è una funzionalità di sicurezza fondamentale in Discourse che aiuta a proteggere contro gli attacchi di Cross-Site Scripting (XSS) e altre iniezioni. Questa guida copre le basi della CSP, come viene implementata in Discourse e come configurarla per il tuo sito.

Cos’è la Content Security Policy?

La Content Security Policy è un ulteriore livello di sicurezza che aiuta a rilevare e mitigare determinati tipi di attacchi, inclusi gli attacchi di Cross-Site Scripting (XSS) e di iniezione di dati. La CSP funziona specificando quali origini di contenuto sono considerate attendibili e istruendo il browser a eseguire o rendere solo le risorse provenienti da tali origini attendibili.

L’XSS rimane una delle vulnerabilità web più comuni. Implementando la CSP, Discourse consente il caricamento e l’esecuzione di script solo da fonti attendibili, riducendo significativamente il rischio di attacchi XSS.

Implementazione della CSP in Discourse

A partire dalla versione 3.3.0.beta1 di Discourse, l’implementazione della CSP utilizza la modalità ‘strict-dynamic’. Questo approccio impiega un singolo valore nonce- e la parola chiave strict-dynamic nella direttiva script-src. Tutti i tag \u003cscript\u003e iniziali nel core e nei temi ricevono automaticamente l’attributo nonce= appropriato.

La policy predefinita include le seguenti direttive:

  • script-src: Specifica le origini valide per gli script JavaScript
  • worker-src: Specifica le origini valide per gli script ServiceWorker
  • object-src: Blocca l’esecuzione di plugin (Flash, Java, ecc.)
  • base-uri: Restringe gli URL per gli elementi \u003cbase\u003e
  • manifest-src: Restringe gli URL per i manifest delle app web
  • frame-ancestors: Controlla quali siti possono incorporare la tua istanza di Discourse in un iframe
  • upgrade-insecure-requests: Aggiorna automaticamente le richieste HTTP a HTTPS (incluso quando force_https è abilitato)

Configurazione della CSP in Discourse

Impostazioni disponibili

  • content_security_policy: Abilita o disabilita la CSP (predefinito: on)
  • content_security_policy_report_only: Abilita la modalità Report-Only della CSP (predefinito: off)
  • content_security_policy_script_src: Consente di estendere la direttiva script-src predefinita
  • content_security_policy_frame_ancestors: Abilita la direttiva frame_ancestors (predefinito: on)

Come abilitare la CSP

  1. Vai al pannello di Amministrazione
  2. Accedi alle impostazioni di Sicurezza
  3. Trova l’impostazione content_security_policy e assicurati che sia abilitata

Si consiglia di iniziare con la modalità Report-Only della CSP per identificare eventuali problemi prima di abilitare completamente la CSP:

  1. Abilita l’impostazione content_security_policy_report_only
  2. Monitora la console del browser per le violazioni della CSP
  3. Risolvi eventuali violazioni legittime estendendo la CSP come necessario
  4. Una volta sicuro che non ci siano falsi positivi, disabilita la modalità Report-Only e abilita completamente la CSP

Estendere la CSP predefinita

Se è necessario consentire origini script aggiuntive, è possibile estendere la direttiva script-src utilizzando l’impostazione content_security_policy_script_src. È possibile aggiungere:

  • Hash delle origini
  • 'wasm-unsafe-eval'
  • 'unsafe-eval' (usare con cautela)

Ad esempio:

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

:warning: Fai attenzione quando aggiungi 'unsafe-eval' o altre direttive permissive, poiché possono ridurre l’efficacia della CSP.

CSP e integrazioni di terze parti

Quando si utilizzano servizi di terze parti come Google Tag Manager, Google Analytics o servizi pubblicitari, potrebbe essere necessario regolare le impostazioni della CSP. Nella maggior parte dei casi con Discourse versione 3.3.0.beta1 o successive, gli script esterni dovrebbero funzionare senza configurazioni aggiuntive grazie all’implementazione della CSP ‘strict-dynamic’.

Se si verificano problemi, potrebbe essere necessario:

  1. Identificare le origini script richieste monitorando la console del browser
  2. Aggiungere le origini necessarie all’impostazione content_security_policy_script_src
  3. Per integrazioni complesse come i servizi pubblicitari che caricano risorse esterne, potrebbe essere necessario abilitare il rendering cross-domain (Esempio di PR da discourse-adplugin che lo fa).

Migliori pratiche

  1. Inizia con la modalità Report-Only della CSP per identificare potenziali problemi
  2. Stringi gradualmente la CSP man mano che risolvi le violazioni legittime
  3. Rivedi regolarmente le impostazioni della CSP e adattale secondo necessità
  4. Fai attenzione quando aggiungi direttive permissive come 'unsafe-eval' o 'wasm-unsafe-eval'
  5. Mantieni aggiornata la tua istanza di Discourse per beneficiare dei miglioramenti più recenti della CSP

Domande frequenti

D: Ricevo molti rapporti di violazione della CSP. Dovrei preoccuparmi?
R: Molte violazioni della CSP sono falsi positivi, spesso causati da estensioni del browser o altri script non correlati. Concentrati sulla risoluzione delle violazioni relative alla funzionalità del tuo sito.

D: Posso utilizzare la CSP con Google AdSense o altre reti pubblicitarie?
R: Sì, ma potrebbe essere necessario utilizzare impostazioni della CSP più permissive. Inizia con la modalità Report-Only e regola le impostazioni in base alle violazioni riportate.

D: Come risolvo i problemi relativi alla CSP?
R: Utilizza gli strumenti per sviluppatori del browser per monitorare la console per i messaggi di violazione della CSP. Questi ti aiuteranno a identificare quali risorse vengono bloccate e perché.

Risorse aggiuntive

56 Mi Piace
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