L' nonce
attributo ti consente di "whitelist" alcuni inline script
ed style
elementi, evitando al contempo l'uso della unsafe-inline
direttiva CSP (che consentirebbe tutto inline script
/ style
), in modo da mantenere comunque la funzione CSP chiave di non consentire inline script
/ style
in generale.
Quindi l' nonce
attributo è un modo per dire ai browser che i contenuti incorporati di un particolare script o elemento di stile non sono stati iniettati nel documento da una terza parte (dannosa), ma sono stati invece inseriti nel documento intenzionalmente da chiunque controlli il server che il documento viene servito a partire dal.
https://developers.google.com/web/fundamentals/security/csp/#if_you_absolutely_must_use_it fornisce un buon esempio di come utilizzare l' nonce
attributo, che equivale ai seguenti passaggi:
Per ogni richiesta ricevuta dal tuo server Web per un particolare documento, fai in modo che il tuo back-end generi una stringa casuale codificata in base64 di almeno 128 bit di dati da un generatore di numeri casuali crittograficamente sicuro; ad es EDNnf03nceIOfn39fn3e9h3sdfa
. Questo è il tuo nonce.
Prendi il nonce generato nel passaggio 1 e, per qualsiasi inline script
/ style
che desideri "inserire nonce
nella whitelist", fai in modo che il tuo codice backend inserisca un attributo nel documento prima che venga inviato via cavo, con quel nonce come valore:
<script nonce="EDNnf03nceIOfn39fn3e9h3sdfa">…</script>
Prendi il nonce generato nel passaggio 1, antepone nonce-
ad esso e fai in modo che il tuo backend generi un'intestazione CSP con quella tra i valori dell'elenco di origine per script-src
o style-src
:
Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'
Quindi il meccanismo di utilizzo di un nonce è un'alternativa al fatto che il tuo back-end generi un hash del contenuto dell'inline script
o style
che desideri consentire, e quindi specifica tale hash nell'elenco di sorgenti appropriato nella tua intestazione CSP.
Si noti che poiché i browser non (non possono) verificare che il valore nonce inviato cambi tra le richieste di pagina, è possibile, sebbene totalmente sconsigliabile, saltare 1 sopra e non fare in modo che il back-end faccia qualcosa in modo dinamico per il nonce, nel qual caso potrebbe semplicemente inserire un nonce
attributo con un valore statico nell'origine HTML del tuo documento e inviare un'intestazione CSP statica con lo stesso valore nonce.
Ma il motivo per cui non vorresti usare un nonce statico in quel modo è che praticamente sconfiggerebbe l'intero scopo di usare il nonce per cominciare, perché, se dovessi usare un nonce statico come quello, a quel punto potresti anche usare unsafe-inline
.