CSP: comment autoriser un evel dangereux pour un préfixe d'URI donné (Firefox)
Je suis en train d'utiliser MathJax dans le cadre de notre application web qui utilise assez strictes Content Security Policy (CSP). Le problème est que MathJax est codé pour utiliser eval()
[pour être exact, en forme de Function()
] qui n'est pas considéré comme sûr par défaut par CSP.
Je suis en utilisant le CSP suivant l'en-tête actuellement:
X-Content-Security-Policy: allow 'self'; img-src *; media-src *; frame-src *; font-src *; frame-ancestors 'none'; style-src *; report-uri '/:save-csp-violation';
Qui provoque MathJax 2.0 code de l'échec, car il utilise Function()
. J'ai essayé de permettre dangereux-eval (c'est à dire Function()
) uniquement pour les MathJax situé au sein de la même origine ci-dessous chemin /:static/math/
. Pour ce faire, j'ai essayé d'ajouter
unsafe-eval '/:static/math/*'
pour faire le plein d'en-tête de ressembler à
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/*'
mais je ne peux toujours pas Firefox 13.0 pour exécuter le code. J'obtiens un message d'erreur de Firefox Web Console (situé dans Outils - 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
Cependant, je ne suis pas un CSP rapport à la rapport-uri". (Comme vous le voyez, je suis actuellement à l'exécution du test personnalisé localhost port sans SSL, dans le cas qui fait une différence. Le côlon avant static
n'est pas une faute de frappe, je suis la réservation de tous les pièces chemin en commençant par un signe deux-points pour l'usage interne de l'application, tout contenu de l'utilisateur peut définir librement les autres Url.)
Est mon utilisation de unsafe-eval
attribut incorrect ou est-il impossible de permettre dangereux-eval seulement pour le sous-ensemble de 'soi'? L'intention est de permettre dangereux-eval seulement pour la même origine préfixe de chemin /:static/math
stricte CSP JS exécution de code pour " self
' et pas de code JS pour toute autre méthode.
source d'informationauteur Mikko Rantalainen
Vous devez vous connecter pour publier un commentaire.
Il y a plusieurs problèmes:
La
Content-Security-Policy
(CSP) de la tête ne fonctionne pas de cette façon. CSP a seulement la granularité d'un seul hôte+port (à l'origine). Si vous ne pouvez pas permettre à tous les scripts ontunsafe-eval
pas de script peut avoir. La seule solution possible est de ne pas utiliser un script qui nécessiteunsafe-eval
(heureusement, MathJax ne nécessite plus deunsafe-eval
depuis MathJax bug 256 a été fixé).La
allow
syntaxe est un vieux Mozilla variante et ne doit pas être utilisé. Le courant la syntaxe est-à-diredefault-src
suivie par le schéma ou de noms d'hôte ou d'origines qui sont autorisés en tant que source de tout et puis de remplacer la valeur par défaut pour chaque sous-type (par exemple,script-src
). Certaines sources peuvent prendre en charge d'autres source de mots clés en plus deself
. Par exemple, lescript-src
prend en chargeunsafe-eval
ce qui signifie que le script qui est par ailleurs autorisé à exécuter est autorisée à utiliser la fonction eval() ou la Fonction(), etunsafe-inline
ce qui signifie que n'importe quel morceau de code qui peut soutenir un certain type de script en ligne est autorisé à exécuter. Permettantunsafe-eval
peuvent être acceptables, maisunsafe-inline
est assez bien ne pas aller avec le script src (sinon, vous ne devez pas vous embêter avec le CSP).La syntaxe correcte pour
script-src
comme suit:combiné avec le chargement de MathJax de https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.4/MathJax.js
MathJax utilise également des attributs de style en ligne de sorte suivants est nécessaire (sauf si déjà autorisé) ou MathJax va augmenter
Exception
tout en essayant de rendre les mathématiques:Il n'est pas possible d'utiliser des CSP pour permettre JS pour insérer des attributs de style et de ne pas avoir les attributs de style déjà inséré dans le code source HTML pour avoir un effet.
Il semble que Firefox 13.0 (au moins) n'est pas immédiatement "appeler à la maison" dans le cas des CSP violation. La plupart des rapports d'infractions ne sont soumis un certain temps après l'événement. Chrome semble être beaucoup plus agressif avec la présentation d'un rapport qui va le rendre un peu plus facile à tester. De mon expérience, Firefox n'est pas toujours envoyer des CSP rapport à tous - c'est peut-être en utilisant une sorte d'heuristique de ne pas envoyer des messages répétés.
En fin de compte, à faire MathJax travailler avec le Contenu-Sécurité-Protection, vous devez les en-têtes suivants (en supposant que vous êtes à l'aide de MathJax via CDNJS):
Les navigateurs plus anciens (par exemple Firefox 13) utilisée pour exiger des paramètres supplémentaires tels que
options
ou nécessaire à l'aide de la non-standard headere nom commeX-Content-Security-Policy
ouX-WebKit-CSP
. Ces hacks ne sont plus nécessaires parce que les agents utilisateurs appui-tête standard de nos jours. (À l'exception de la MSIE en contrairement à ce que MME Bord.)