Verifica dell'intestazione CSP

Basta incollare il valore dell'intestazione Content-Security-Policy per convalidarne in blocco direttive e sorgenti. Rileva le impostazioni pericolose come unsafe-inline, la mancanza di default-src e gli errori di digitazione nei nomi delle direttive, mostrando in modo chiaro le sorgenti ammesse per ciascuna.

Esaminare il contenuto di un'intestazione CSP

Una Content-Security-Policy è un'unica lunga stringa separata da punti e virgola, e seguirla a occhio rende facile lasciarsi sfuggire ciò che vi è di rischioso. Questo strumento prende il valore che incollate, lo scompone in direttive e sorgenti, porta alla luce le impostazioni pericolose, le dichiarazioni assenti e gli errori di grafia, ed espone che cosa ciascuna direttiva consenta davvero.

Una direttiva scritta male è, fra tutti, il caso più insidioso. I browser trascurano in silenzio le direttive che non riconoscono, sicché scrivere scipt-src invece di script-src non provoca errore alcuno mentre quella parte della politica continua a non fare assolutamente nulla. Altrettanto facile da lasciarsi sfuggire è l'assenza di default-src: senza di essa ogni direttiva che non abbiate dettagliato resta senza restrizione e nella difesa si apre una falla. E mettere unsafe-inline in script-src annulla quasi del tutto il blocco degli script in linea, che è la ragione prima per adottare CSP.

Come si usa

  1. Incollate il valore dell'intestazione CSP Inserite una stringa della forma default-src 'self'; script-src ... così com'è.
  2. Provate prima gli esempi Sono forniti un buon esempio e uno cattivo, così potete vedere in che cosa differiscano i giudizi prima di cominciare.
  3. Leggete i punti sollevati Vengono segnalati unsafe-inline, l'assenza di default-src e gli errori di grafia.
  4. Rivedete le sorgenti consentite per ciascuna direttiva A colpo d'occhio vedete da dove il caricamento sia permesso.

Consigli per sfruttarlo al meglio

  • La politica si distribuisce di norma come intestazione della risposta HTTP, ma la si può indicare anche con il marcatore <meta http-equiv="Content-Security-Policy">; alcune direttive, come quella per le segnalazioni, non funzionano però nel metadato.
  • Prima di applicarla direttamente in produzione, conviene raccogliere le sole segnalazioni di violazione con l'intestazione in sola segnalazione, verificare l'impatto sulle funzioni esistenti e passare poi all'applicazione effettiva.
  • Il carattere jolly e il valore 'unsafe-inline' facilitano le prove di funzionamento ma compromettono gravemente l'efficacia della politica contro gli attacchi di scripting fra siti: le impostazioni permissive usate in sviluppo vanno sempre restrette prima della pubblicazione.
  • Scrivendo più volte la stessa direttiva vale soltanto la prima. Per aggiungere o sostituire impostazioni occorre riunire le sorgenti in un'unica direttiva.
  • Nella console degli strumenti per sviluppatori del navigatore, le risorse bloccate dalla politica compaiono in rosso con un messaggio di rifiuto: è il primo posto da controllare durante la messa a punto.

Quando torna utile

Nell'introdurre per la prima volta una CSP

Potete accertare che la politica scritta faccia ciò che intendevate ben prima che si avvicini alla produzione.

Nel fare l'inventario di una politica esistente

Una politica cresciuta per accumulo tende a conservare permessi per domini che nessuno usa più.

Nel passare dalla sola segnalazione all'applicazione

Un valore provato sotto Content-Security-Policy-Report-Only si può esaminare prima di imporlo.

Nell'assistere una revisione del codice

Incollate la politica modificata e accertate che non ne esca indebolita.

Termini della CSP

Direttiva
Una voce come script-src o img-src che dichiara da dove una data classe di risorsa possa essere caricata.
Default-src
Il valore di ripiego per ogni direttiva non dichiarata a parte. Ometterla lascia senza restrizione ogni classe che non abbiate dettagliato.
'self'
Un'espressione di sorgente che consente i soli caricamenti dalla stessa origine.
'unsafe-inline'
Un'espressione di sorgente che consente script e stili scritti direttamente nell'HTML. Sacrifica quasi per intero la difesa contro l'XSS, perciò si consiglia di sostituirla con un nonce o un hash. Tenete presente che i browser compatibili con CSP Level 3 ignorano 'unsafe-inline' quando la stessa lista di sorgenti contiene un nonce o un hash: affiancarlo per i browser più vecchi è quindi una pratica comune.
Nonce
Un procedimento che scrive un valore casuale a uso singolo sia nel tag dello script sia nella politica, affinché i due si corrispondano. È il modo sicuro di consentire codice in linea.
Frame-ancestors
Una direttiva che nomina chi possa incorporare il vostro sito in un riquadro. È l'erede di X-Frame-Options.

Domande frequenti

La politica dichiara al navigatore da quali origini sia lecito caricare script, immagini e fogli di stile in quella pagina. Il caricamento da sorgenti non elencate e l'esecuzione di script incorporati vengono bloccati, riducendo di molto il rischio che un attacco di scripting fra siti esegua codice malevolo esterno.

Sì, con le sorgenti fondate sul numero d'uso unico, nella forma 'nonce-valore-casuale', oppure sulla sintesi, nella forma 'sha256-valore'. Assegnando al marcatore dello script l'attributo con il numero d'uso unico e facendolo coincidere con quello dell'intestazione, si autorizza quel solo marcatore bloccando ogni altro script incorporato indebito.

Perché la politica ha bloccato il caricamento da origini non elencate. Nella console del navigatore compare un messaggio di rifiuto che riporta il dominio in questione e la direttiva violata: aggiungete quell'origine all'elenco della direttiva corrispondente.

Nella maggior parte dei casi no. La direttiva default-src funziona da ripiego quando manca una direttiva specifica, ma quelle relative agli script e agli oggetti presentano una superficie d'attacco ampia e si raccomanda di configurarle esplicitamente in modo rigoroso.

Entrambe indicano dove il navigatore debba inviare le segnalazioni di violazione. La prima appartiene alla vecchia specifica e indica direttamente l'indirizzo di destinazione; la seconda si fonda sulla nuova interfaccia per le segnalazioni e rimanda al nome di un gruppo definito in anticipo nell'apposita intestazione. Per compatibilità con i vari navigatori si raccomanda di indicarle entrambe.
Tool-kun

A proposito — perché è nata la politica di sicurezza dei contenuti, ossia la storia di una difesa che la sola cura nell'uscita non bastava a garantire

La politica di sicurezza dei contenuti nasce da un'idea proposta intorno al 2004 da Robert Hansen, sviluppata in specifica a partire dal 2008 circa soprattutto da Brandon Sterne, ingegnere di Mozilla, e formalizzata nel 2012 come prima raccomandazione candidata del consorzio del web. All'epoca, fra le vulnerabilità delle applicazioni web, gli attacchi di scripting fra siti erano considerati i più gravi, e ci si rese conto che affidarsi soltanto alla diligenza di chi programma nel proteggere ogni uscita aveva dei limiti: nacque così un meccanismo di difesa a più strati, che impone dal lato del navigatore un limite all'origine degli script eseguibili.

Con la seconda versione della specifica si introdusse l'autorizzazione degli script incorporati tramite numero d'uso unico o sintesi, che permette di consentirne alcuni senza ricorrere a 'unsafe-inline'. La terza versione ha aggiunto la parola chiave che considera automaticamente attendibili gli script figli caricati da uno script già attendibile, riducendo di molto il costo di manutenzione degli elenchi di autorizzazione nei siti di grandi dimensioni.

Google lavora da tempo per introdurre nei propri servizi una politica rigorosa fondata sui numeri d'uso unici e da quell'esperienza ha pubblicato una ricerca secondo cui le politiche basate su elenchi di nomi host si aggirano facilmente, mentre quelle fondate su numeri d'uso unici e sintesi sono assai più efficaci. Quelle conclusioni sono oggi ampiamente citate come buona pratica e mostrano quanto conti non soltanto vietare i valori pericolosi, ma decidere fin dall'inizio su quale metodo fondare le autorizzazioni.