Estensione degli hash supportati in script-src

Carlos Joan Rafael Ibarra Lopez
Carlos Joan Rafael Ibarra Lopez
Mustafa Emre Acer
Mustafa Emre Acer

Data di pubblicazione: 17 novembre 2025

A partire da Chrome 141, puoi partecipare alla prova dell'origine per testare le nuove funzionalità di Content Security Policy (CSP) che Chrome sta introducendo. Queste funzionalità aiutano i siti web a proteggersi dagli attacchi XSS consentendo meglio l'inserimento nella lista consentita di fonti note di JavaScript. L'inserimento nella lista consentita di JavaScript noti e il blocco di tutte le altre origini è un modo efficace per prevenire gli attacchi XSS. Il codice JavaScript inserito dall'autore dell'attacco non sarà presente nella lista consentita e pertanto verrà bloccato.

Senza queste funzionalità, è difficile avere una CSP "rigida" che consenta tutte le origini JavaScript senza un meccanismo di comunicazione nonce tra l'host dello script e il sito o senza conoscere in anticipo l'hash completo dello script. Entrambi i metodi sono difficili da implementare se lo script cambia di frequente ed è ospitato da una terza parte attendibile, ma separata. Inoltre, se uno script deve utilizzare eval, attualmente CSP richiede di inserire eval nella lista consentita per tutti gli script, rendendolo molto più debole.

Stiamo cercando di colmare questa lacuna fornendo un meccanismo più efficace per la creazione di liste consentite basate su URL degli script in script-src e un meccanismo per la creazione di liste consentite per le chiamate a eval. Potrai utilizzare il meccanismo di hashing esistente in script-src per inserire nella lista consentita gli URL di script specifici e JavaScript passati a eval (e altre funzioni simili a eval). Anche se l'inserimento nella lista consentita basato su URL non è rigido come un CSP basato sull'integrità, questo meccanismo dovrebbe rappresentare un grande miglioramento rispetto alla lista consentita di nomi host esistente.

Riteniamo che questo fornisca un criterio CSP più facile da implementare che mitiga comunque in modo efficace gli attacchi XSS bloccando gli script in linea e di valutazione non consentiti. Queste nuove funzionalità sono progettate e implementate con cura per consentire ai siti di impostare un criterio che offra una maggiore sicurezza nei browser che supportano la nuova funzionalità, senza causare interruzioni o regressioni della sicurezza nei browser che non la supportano, senza dover eseguire lo sniffing dello user agent.

Casi d'uso

Inserire URL specifici nella lista consentita per l'utilizzo con script-src

I siti che vogliono inserire nella lista consentita script specifici da utilizzare con script-src attualmente hanno due opzioni: inserire nella lista consentita i contenuti degli script tramite l'integrità delle risorse secondarie (SRI) o utilizzare host-source per inserire nella lista consentita i nomi host. L'integrità secondaria delle risorse spesso non è pratica per gli script che cambiano spesso (ad esempio, gli script di analisi). La specifica di host-source verrà ignorata quando è impostato anche strict-dynamic e non è una protezione completa, poiché non include i parametri URL. Questa modifica consentirà di inserire nella lista consentita gli script utilizzando un hash del loro URL (completo), supportando sia gli script dinamici sia le configurazioni che utilizzano strict-dynamic.

Consenti l'utilizzo di script specifici con funzioni eval o simili

Alcuni siti richiedono l'utilizzo di funzioni eval o simili (passaggio di codice come stringhe letterali in setTimeout, setInterval e setImmediate). Per questi siti, l'unica opzione CSP disponibile è unsafe-eval, che attiva tutte le chiamate a eval. Stiamo aggiungendo un meccanismo per consentire l'inserimento di input specifici nella lista consentita per la valutazione. Questo nuovo meccanismo consente di creare una lista consentita ristretta degli script specifici necessari eseguendo l'hashing dei contenuti dello script direttamente, anziché essere costretti a fornire una CSP unsafe-eval eccessivamente ampia.

Inizia

Per provare il supporto dell'hashing di script e eval, partecipa alla prova dell'origine di hash di URL e eval in CSP script-src, in esecuzione da Chrome 141 a 144.

Aggiungi hash a script-src

Gli URL vengono inseriti nella lista consentita aggiungendo un valore alla direttiva CSP script-src nel formato url-<hash-algorithm>-<script-url-hash>. In questo modo, tutti i contenuti pubblicati dall'URL, indipendentemente dal tipo, potranno essere eseguiti. L'hash deve includere solo l'URL iniziale (l'URL incluso nella pagina), non gli URL a cui reindirizza l'URL. Sono supportati sia gli URL assoluti che quelli relativi.

Ad esempio, la seguente intestazione CSP inserirà nella lista consentita lo script pubblicato all'indirizzo https://example.com/example.js:

Content-Security-Policy: script-src 'sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc=';

dove 'sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc=' è l'hash sha256 di "https://example.com/example.js".

Gli script valutati tramite eval o new Function possono essere inseriti nella lista consentita includendo eval-<hash-algorithm>-<script-contents-hash> in src dello script. Ad esempio, la seguente intestazione CSP consentirà di inserire nell'allowlist il passaggio della stringa alert("hello world") a eval():

Content-Security-Policy: script-src 'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0=';

dove 'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0=' è l'hash sha256 di alert("hello world").

Per favorire l'adozione, quando un sito partecipa alla prova dell'origine, gli hash per gli URL e eval verranno stampati nella console DevTools e inclusi nei report CSP. Ciò significa che è possibile utilizzare un criterio rigoroso, ma report-only, per enumerare tutti gli hash necessari per la lista consentita.

Mantenere la compatibilità con le versioni precedenti

Per consentire l'implementazione di questi criteri prima che tutti i browser abbiano aggiunto il supporto, gli hash degli URL possono essere elencati dopo le liste consentite basate sull'host. I browser che comprendono i nuovi tipi di hash ignoreranno le liste consentite basate sull'host precedenti, mentre i browser che non comprendono i nuovi tipi di hash continueranno ad applicare la lista consentita basata sull'host, consentendo ai siti di impostare entrambi, utilizzando le norme più restrittive nei browser che le supportano, senza rischiare interruzioni nei browser che non le supportano, come mostrato nell'esempio seguente.

Content-Security-Policy: script-src 'https:' 'url-sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='

Abbiamo anche introdotto strict-dynamic-url, un equivalente di strict-dynamic che si applica solo quando vengono impostati gli hash degli URL. Poiché strict-dynamic fa sì che le allowlist basate sull'host vengano ignorate, un sito che vuole inserire in allowlist un hash specifico e a cui applicare strict-dynamic può utilizzare una policy come:

Content-Security-Policy: https: 'strict-dynamic-url' 'url-sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='

In questo esempio, i browser che non supportano ancora gli hash applicheranno solo https:. unsafe-eval verrà ignorato in modo simile dai browser supportati quando sono presenti hash di valutazione. Ad esempio, le seguenti norme verranno valutate come unsafe-eval. In questo modo, l'utilizzo di eval() è consentito su tutti i browser che non supportano ancora gli hash eval, mentre è consentito solo l'utilizzo di eval() di alert("hello world") tra i browser che supportano gli hash eval.

  Content-Security-Policy: script-src "unsafe-eval" "'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0='"

Condividi feedback

Ci interessano i feedback degli sviluppatori su queste estensioni di script-src. Pubblica eventuali commenti come issue nella spiegazione su GitHub.