11

Sto provando a utilizzare MathJax come parte della nostra applicazione web che utilizza il rigoroso Content Security Policy (CSP). Il problema è che MathJax è codificato per utilizzare eval() [per essere precisi, nella forma di Function()] che non è considerato sicuro per impostazione predefinita da CSP.CSP: Come consentire la valutazione non sicura per un dato prefisso URI (Firefox)

sto usando seguente intestazione CSP attualmente:

X-Content-Security-Policy: allow 'self'; img-src *; media-src *; frame-src *; font-src *; frame-ancestors 'none'; style-src *; report-uri '/:save-csp-violation'; 

che fa sì che il codice mathjax 2.0 a fallire perché utilizza Function(). Ho provato a consentire la valutazione non sicura (ad esempio Function()) solo per MathJax situato all'interno della stessa origine sotto il percorso /:static/math/. Per fare questo, ho provato ad aggiungere

unsafe-eval '/:static/math/*' 

per rendere l'intestazione completa assomigliare

X-Content-Security-Policy: allow 'self'; img-src *; media-src *; frame-src *; font-src *; frame-ancestors 'none'; style-src *; report-uri '/:save-csp-violation'; unsafe-eval '/:static/math/*' 

, ma non riesco ancora a Firefox 13.0 per eseguire il codice. Ricevo un messaggio di errore per Firefox Web Console (che si trova in Strumenti - Web Developer):

[10:09:59.072] call to Function() blocked by CSP @ http://localhost:8080/:static/math/2.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML:29 

Tuttavia, non sto ottenendo un rapporto CSP per il 'report-uri'. (Come puoi vedere, sto attualmente eseguendo il test tramite la porta personalizzata localhost senza SSL, nel caso in cui ciò faccia la differenza. I due punti prima di static non sono un errore di battitura, sto riservando tutte le parti del percorso che iniziano con due punti per uso interno di l'applicazione, tutti i contenuti utente può definire liberamente altri URL.)

è il mio uso di unsafe-eval attributo non corretto o è impossibile consentire non sicuro-eval solo per sottoinsieme di 'sé'? L'intento è di consentire la valutazione non sicura solo per lo stesso prefisso del percorso di origine /:static/math, l'esecuzione rigorosa del codice JS CSP per 'self' e nessun codice JS per nessun altro metodo.

risposta

13

Ci sono diverse questioni: intestazioni

  1. CSP non funzionano in questo modo. CSP ha solo granularità di una singola combinazione host + porta (origine). Se non puoi consentire a qualsiasi script nel tuo host di avere unsafe-eval, nessuno script può averlo. L'unica soluzione possibile è non utilizzare uno script che richiede unsafe-eval (buona fortuna scrivere un sostituto MathJax da solo).

  2. La sintassi allow è una vecchia variante di Mozilla e non deve essere utilizzata. La sintassi corrente è default-src seguita da schemi o nomi host o origini consentiti come origine di tutto e quindi sovrascrivere il valore predefinito per ciascun sottotipo (ad esempio script-src) in base alle esigenze. Alcune fonti potrebbero supportare parole chiave di origine aggiuntive oltre a self. Ad esempio, lo supporta , il che significa che qualsiasi script che è altrimenti autorizzato ad eseguire è autorizzato a eseguire eval() o Function() e unsafe-inline significa che qualsiasi pezzo di markup in grado di supportare qualche tipo di script inline può eseguire . Consentire unsafe-eval può essere accettabile ma lo unsafe-inline è praticamente privo di script-src (altrimenti, non dovresti preoccuparti del CSP).

  3. La sintassi corretta per script-src come segue:

    script-src 'self' 'unsafe-inline' 
    
  4. mathjax usa anche stile in linea attributi segue in modo che è necessario (se non già consentito) o mathjax colpirà Exception s durante il tentativo di rendere la matematica:

    style-src 'self' 'unsafe-inline' 
    

    Non è possibile utilizzare CSP per consentire a JS di inserire attributi di stile e di non avere attributi di stile già inseriti nell'origine HTML per avere un effetto.

  5. Sembra che Firefox 13.0 (almeno) non "chiama a casa" immediatamente in caso di violazione CSP. La maggior parte dei rapporti di violazione viene inviata qualche tempo dopo l'evento. Chrome sembra essere molto più aggressivo con l'invio del report che renderà un po 'più facile la prova. Dalla mia esperienza, Firefox non invia sempre un rapporto CSP - potrebbe utilizzare una sorta di euristica per non inviare messaggi ripetuti.

Bonus: Sostenere WebKit, è necessario ripetere la configurazione con X-WebKit-CSP intestazione HTTP.

Alla fine, per far funzionare mathjax con Content-Security-Protection, è necessario seguenti intestazioni (supponendo che si sta distribuendo biblioteca mathjax da soli, invece che attraverso il mathjax CDN):

X-Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; options eval-script 
X-WebKit-CSP: default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline' 
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline' 

Qui l'attributo options è richiesto per Firefox 13.0 e inferiore. Ho segnalato il problema CSP a MathJax al https://github.com/mathjax/MathJax/issues/256.

+1

Firefox 13.0 contiene anche un bug o una funzionalità mancante che l'intestazione CSP non corrisponde alla variante W3C. Vedi il bug qui: https://bugzilla.mozilla.org/show_bug.cgi?id=746978 –

Problemi correlati