Qual è lo scopo dell'attributo HTML "nonce" per gli elementi di script e di stile?


141

W3C dice che c'è un nuovo attributo nel HTML5.1 chiamato nonceper stylee scriptche può essere utilizzata dal contenuto la politica di sicurezza di un sito web.

Ho cercato su Google ma alla fine non ho capito cosa fa effettivamente questo attributo e cosa cambia quando lo si utilizza?


2
Sembra che sia solo un po 'più di sicurezza per il tuo sito, lo aggiungi a un link o a un modulo e quando la pagina viene pubblicata, se il nonce non corrisponde al tuo, allora non servi la pagina
Pete

@Pete Intendi che nessuno potrebbe caricare il tuo scripte style? Qualcosa come il divieto di hotlink?
ata

è anche per le normali pagine e la convalida dei moduli
Pete

Risposte:


196

L' nonceattributo ti consente di "whitelist" alcuni inline scripted styleelementi, evitando al contempo l'uso della unsafe-inlinedirettiva CSP (che consentirebbe tutto inline script/ style), in modo da mantenere comunque la funzione CSP chiave di non consentire inline script/ stylein generale.

Quindi l' nonceattributo è 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' nonceattributo, che equivale ai seguenti passaggi:

  1. 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.

  2. Prendi il nonce generato nel passaggio 1 e, per qualsiasi inline script/ styleche desideri "inserire noncenella 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>
  3. 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-srco 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 scripto styleche 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 nonceattributo 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.


17
Non serve per verificare l'utente, ma per verificare che il contenuto inline di un particolare script o elemento di stile non sia stato inserito nel documento di una mia terza parte (dannosa), ma sia stato inserito intenzionalmente nel documento da chiunque controlli il server sul documento. è servito da. (Aggiornerò la mia risposta per dirlo.)
sideshowbarker

3
Non è necessario che i nonces vengano archiviati, ma vengono generati in memoria e inseriti nell'intestazione CSP e nel documento HTML che viene inviato via cavo nelle risposte (non all'origine archiviata sul file system / database del server).
sideshowbarker,

3
Per quanto riguarda qualsiasi motivo per impegnarsi nell'uso noncedell'attributo, se non è assolutamente necessario utilizzarlo, non farlo. In realtà è pensato solo per i casi in cui per qualche motivo non è possibile (ancora) eliminare alcuni script in linea o contenuti di stile da un determinato documento (ma è necessario rimuoverlo in seguito). Quindi, se per qualche motivo sei bloccato con la necessità di mantenere in linea lo script e il contenuto dello stile, nel frattempo puoi almeno usare il meccanismo nonce per consentire ai browser di verificare che siano OK. Altrimenti dovresti semplicemente utilizzare CSP come previsto, e non consentire alcun script in linea o elementi di stile
sideshowbarker

2
@sideshowbarker, Cosa fa un nonce vuoto? Sto vedendo pagine con <script type="text/javascript" nonce>e<style type="text/css" nonce>
Pacerier,

7
Nota: se lo script è statico, raccomando un hash CSP, piuttosto che un nonce.
Brian
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.