11

Ich versuche MathJax als Teil unserer Webanwendung zu verwenden, die ziemlich streng Content Security Policy (CSP) verwendet. Das Problem besteht darin, dass MathJax für die Verwendung von eval() [in Form von Function()] codiert ist, was von CSP standardmäßig nicht als sicher angesehen wird.CSP: Wie kann unsafe-eval für ein gegebenes URI-Präfix (Firefox) erlaubt werden

Ich verwende folgende CSP-Header zur Zeit:

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

Welche Mathjax 2.0-Code führt zum Scheitern verurteilt, weil es Function() verwendet. Ich habe versucht, unsafe-eval (d. H. Function()) nur für MathJax zuzulassen, das sich im selben Ursprung unter dem Pfad /:static/math/ befindet. Um dies zu erreichen, habe ich versucht,

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

hinzufügen, um die vollständigen Header wie

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/*' 

aussehen zu lassen, aber ich kann immer noch nicht Firefox 13.0, um den Code auszuführen. Ich erhalte eine Fehlermeldung an Firefox Web Console (in Tools - 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 

Aber ich bin kein CSP-Bericht zu dem 'Bericht-uri' bekommen. (Wie Sie sehen, führe ich den Test derzeit über einen benutzerdefinierten Localhost-Port ohne SSL durch, falls das einen Unterschied macht. Der Doppelpunkt vor static ist kein Tippfehler, ich reserviere alle Pfadteile, die mit einem Doppelpunkt für den internen Gebrauch beginnen die Anwendung, alle Benutzerinhalte können andere URLs frei definieren.)

Ist meine Verwendung von unsafe-eval Attribut falsch oder ist es unmöglich, unsafe-eval nur für eine Teilmenge von "self" zu erlauben? Die Absicht ist, unsafe-eval nur für das gleiche Ursprungswegpräfix /:static/math, strenge CSP JS-Codeausführung für 'self' und keinen JS-Code für irgendeine andere Methode zu erlauben.

Antwort

13

sind es mehrere Probleme:

  1. CSP-Header nicht funktionieren auf diese Weise. CSP hat nur die Granularität einer einzelnen Host + Port-Kombination (Ursprung). Wenn Sie keinem Skript in Ihrem Host erlauben können, unsafe-eval zu haben, kann kein Skript es haben. Die einzige mögliche Problemumgehung besteht darin, kein Skript zu verwenden, das unsafe-eval erfordert (viel Glück beim Schreiben eines MathJax-Ersatzes selbst).

  2. Die allow Syntax ist eine alte Mozilla-Variante und sollte nicht verwendet werden. Die aktuelle Syntax lautet default-src, gefolgt von Schema- oder Hostnamen oder Ursprüngen, die als Quelle für alles erlaubt sind, und dann den Standardwert für jeden Untertyp (z. B. script-src) nach Bedarf überschreiben. Einige Quellen unterstützen möglicherweise zusätzliche Quellschlüsselwörter zusätzlich zu self. Zum Beispiel unterstützt script-srcunsafe-eval, was bedeutet, dass jedes Skript, das sonst ausgeführt werden darf, eval() oder Function() ausführen darf, und bedeutet, dass jedes Markup-Element, das eine Art Inline-Skript unterstützt, ausgeführt werden darf . Zulassen unsafe-eval kann akzeptabel sein, aber unsafe-inline ist so gut wie nichts mit Skript-src (sonst sollten Sie überhaupt nicht mit dem CSP belästigen).

  3. Die korrekte Syntax für script-src wie folgt:

    script-src 'self' 'unsafe-inline' 
    
  4. Mathjax verwendet auch Inline-Style-Attribute so benötigt wird, folgenden (es sei denn bereits erlaubt) oder Mathjax wird Exception s schlagen, während die Mathematik zu machen versucht:

    Es ist nicht möglich, CSP zu verwenden, damit JS Stilattribute einfügt und nicht bereits in der HTML-Quelle eingefügte Stilattribute einen Effekt haben.

  5. Es scheint, dass Firefox 13.0 (zumindest) im Falle einer CSP-Verletzung nicht sofort "nach Hause ruft". Die meisten Verstoßberichte werden einige Zeit nach dem Ereignis übermittelt. Chrome scheint mit der Einreichung des Berichts viel aggressiver zu sein, was es ein bisschen leichter macht, dagegen zu testen. Aus meiner Erfahrung sendet Firefox nicht immer CSP-Bericht überhaupt - es kann eine Art Heuristik verwenden, um wiederholte Nachrichten nicht zu senden.

Bonus: Um Webkit zu unterstützen, müssen Sie die Konfiguration mit X-WebKit-CSP HTTP-Header wiederholen.

Am Ende Mathjax Arbeit mit Content-Security-Schutz zu machen, müssen Sie folgende Header (vorausgesetzt, Sie Mathjax Bibliothek selbst sind zu verteilen, anstatt über das 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' 

Hier Das Attribut options ist für Firefox 13.0 und kleiner erforderlich. Ich habe das CSP-Problem an MathJax unter https://github.com/mathjax/MathJax/issues/256 gemeldet.

+1

Firefox 13.0 enthält auch einen Fehler oder fehlende Funktion, dass es CSP-Header nicht mit der W3C-Variante übereinstimmt. Sehen Sie den Fehler hier: https://bugzilla.mozilla.org/show_bug.cgi?id=746978 –