Qual è il modo Content-Security-Policy-friendly per consegnare i dati dal server al browser al caricamento della pagina?

6

Quando si sviluppa per il web, spesso mi trovo a voler passare alcune variabili dagli script del server al mio javascript - i dati estratti da un database e impostati diversamente su pagine diverse che eseguono fondamentalmente lo stesso codice. (In genere, questo è qualcosa sulla falsariga di example.com/slideshows/1 che ha bisogno di sapere che quella presentazione 1 ha 8 immagini e quali sono i loro url, ma questo è solo un esempio casuale, sto cercando una risposta generale.)

Il mio approccio normale è quello di includere un breve blocco di javascript in linea che imposta alcune variabili globali o chiama alcune funzioni di inizializzazione, che è semplice ed efficace. Tuttavia, non è favorevole alla politica di Content Security, dal momento che javascript inline è bloccato per impostazione predefinita e non senza motivo. (So che la politica può essere impostata per consentire javascript in linea se si ha accesso ad essa, ma anche se lo si fa apre potenziali problemi di sicurezza.) Ho bisogno di una strategia che funzioni bene con CSP adeguati.

So che potrebbe essere fatto con una chiamata ajax, ma questo è eccessivo per qualcosa che deve essere impostato solo una volta e aggiunge una chiamata in più che rallenta il caricamento della pagina. In alcuni casi, come la presentazione che ho menzionato, questo potrebbe essere gestito avendo il javascript esaminare altri elementi di pagina costruiti in modo dinamico per ricostruire i dati desiderati, che va bene, ma non è una soluzione molto generale. Qual è il modo migliore per gestirlo?

(Ho quasi postato questa domanda su SO, ma sembra un po 'soggettivo, posso pensare a modi per farlo, non mi piace come nessuno di essi.)

    
posta user1618143 23.07.2014 - 00:04
fonte

2 risposte

3

Potresti usare un hash. Se avessi uno script in linea come questo:

<script>alert('Hello, world.');</script>

Puoi cancellarlo e specificarlo nell'intestazione Content-Security-Policy.

Content-Security-Policy: script-src 'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng='

C'è anche un meccanismo per usare un nonce:

<script nonce=EDNnf03nceIOfn39fn3e9h3sdfa>
Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa' 

Esempi tratti da: link

Se davvero non lo vuoi nemmeno, non hai molte opzioni, ma potresti:

  • Se è possibile utilizzare HTTP 2.0 (SPDY), è possibile sfruttare il push sul lato server. ( link )
  • Inserisci i dati nel tag HTML nascosto o nell'attributo dei dati (lordo, lo so, ma stiamo esplorando le opzioni qui)
  • Riempi in un'intestazione personalizzata.
risposta data 31.08.2015 - 07:39
fonte
0

Se devi solo passare una stringa semplice dal lato server a JavaScript, al momento del caricamento, con un CSP di blocco standard in linea, immagino utilizzando un HTML5 data-tag è il modo più "ufficiale" come Newtang ha risposto ... sebbene , se desideri un approccio più generale che possa includere altri tipi di dati come array / oggetto , quanto segue potrebbe aiutarti ...

Lingua del lato server Imposta CSP (tag <meta> o intestazione)

Se stai utilizzando una "politica di sicurezza dei contenuti" in un tag <meta> o un'intestazione impostata dal linguaggio di programmazione lato server, piuttosto che un'intestazione impostata dal server stesso e assumendo, come nel tuo caso, lo script / Gli stili non possono essere realmente spostati in un file esterno statico e sono troppo poco pratici per essere richiesti da AJAX. Dovrai ricorrere a un'eccezione hash ...

Poiché stai già leggendo i dati ed esegui l'output nella sintassi JavaScript sul lato server, è abbastanza semplice memorizzare tutto il codice JavaScript (popolato con i dati, ad es. stringhe, JSON ecc. ed escludendo i tag di script effettivi) in un stringa, hash utilizzando l'algoritmo SHA, quindi restituire l'hash risultante nel meta tag CSP insieme al codice JavaScript corrente (ora con tag di script) "in seguito" nel documento.

Questo ha il vantaggio aggiunto (su un nonce) di garantire che il codice JS sia intatto e non modificato all'interno del tag script appena autorizzato, poiché l'hash non corrisponderebbe se questo contenuto dello script fosse stato modificato durante il transito.

Ad esempio, in PHP:

<?php echo "<meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'self' 'sha256-".base64_encode(hash('sha256', $JavaScript_code, true))."'\">"; ?>

il true in hash() serve a garantire che l'output sia in binario in quanto gli esiti minuscoli predefiniti non funzioneranno.

E poi, "in seguito" nel documento, genera l'effettivo JavaScript, prestando molta attenzione agli spazi bianchi (ad esempio spazi, schede, formattazione) che alterano l'hash.

<?php echo '<script type="text/javascript">'.$JavaScript_code.'</script>'; ?>

link

Sarebbe un po 'meno stretto in avanti se il CSP è impostato in un'intestazione tramite il server httpd direttamente (come è preferito) ...

Dovresti modificare l'header CSP inviato dal server con un hash o nonce aggiuntivo prima che venga inviato al client (non così facile) e semplicemente impostando un nuovo tag <meta> con l'hash / nonce generato dal lato server il codice non ha precedenti sull'intestazione già impostata . (riferimento nella sezione "Sintassi e consegna", anche se sono sicuro che c'è un riferimento più ufficiale da qualche parte) .

    
risposta data 10.10.2016 - 22:17
fonte

Leggi altre domande sui tag