Contrairement aux site traditionnels, les apps privilégiées et certifiées imposent une CSP (politique de sécurité de contenu) par défaut. Cela peut faire cesser de fonctionner une importante partie du code lors de portages et peut causer une confusion importante chez les développeurs qui ne seraient pas au courant de l'existence de la CSP.
Si une CSP est spécifiée dans le Manifeste de l'app, la CSP spécifiée et celle par défaut pour le type de l'app seront fusionnées. Une CSP spécifiée ne peut abaisser les restrictions de la CSP par défaut.
Le Validateur du Firefox Marketplace détecte les violations de la CSP pendant le processus de soumission d'app. Il peut être utilisé pour aider à détecter les problèmes dès les débuts du développement d'une app.
Restrictions applicables de la CSP
- Les scripts distants sont interdits
-
Vous ne pouvez mettre en source d'un
<script>
un fichier javascript distant. Cela implique que tout fichier JS utilisé par l'app doit être inclu dans le package. - Les scripts inline sont interdits
-
Vous ne pouvez inclure de scripts inline dans votre HTML. Toute balise
<script>
doit avoir un attributsrc=""
. Vous ne pouvez pas non plus utiliser les attributs de script commeonclick=""
ouonload=""
. Vous ne pouvez pas créer de balise<script>
dynamiquement et assigner de contenu à leur propriétéinnerHTML
. -
Les URI
javascript:
sont interdites -
Les URIs du type
<a href="javascript:alert('foo')">
ne seront pas exécutées. -
eval
est interdit -
Vous ne pouvez pas utiliser la fonction
eval()
ou l'opérateureval
. Les deux lanceront des erreurs de sécurité. - Le constructeur de fonction est interdit
-
Vous ne pouvez pas utiliser le constructeur
Function()
. L'utiliser lancera une erreur de sécurité. -
L'exécution de code dynamique dans
setTimeout
etsetInterval
est interdite -
Vous DEVEZ passer des objets appelables (c-à-d: fonctions) aux fonctions
setTimeout
etsetInterval
. Leur passer des chaînes de caractères ne créera pas de timer et la fonction retournera 0. - Les Web Workers distants ne sont pas autorisés
-
Si un Worker ou un SharedWorker est créé avec une URL distante, il se comportera comme si le serveur avait répondu avec une erreur
400
. - Les balises Script ne peuvent être créées avec des URL distantes
-
Si une balise
<script>
est créée viadocument.createElement()
, donner à son attributsrc
une URL distante la fera se comporter comme si le serveur avait répondu avec une erreur400
. - Les plugins sont interdits
-
L'utilisation de balises
<object>
et<embed>
est interdite. Java, Unity, Silverlight, Flash, ou Shockwave ne peuvent être utilisés. - Les styles distants sont interdits
-
Toute balise
<link rel="stylesheet" href="...">
doit référer à des fichiers dans le package de votre app. Les styles inline (style=""
) et les balises<style>
sont cependant autorisées pour les apps privilégiées.
Restrictions des apps certifiées
Les apps certifiées sont sujettes à d'autres restrictions.
- Les styles inline sont interdits
-
<style>
etstyle=""
sont tous deux interdits.
Politiques par défaut
Les politiques par défaut sont les suivantes:
- CSP des apps privilégiées
-
default-src *; script-src 'self'; object-src 'none'; style-src 'self' 'unsafe-inline'
- CSP des apps certifiées
-
default-src *; script-src 'self'; object-src 'none'; style-src 'self'
Problèmes communs et questions fréquement posées
- Mon app privilégiée lance des erreurs lorsque j'essaie d'utiliser jQuery.
-
Si votre app réfère au CDN de jQuery, votre code viole la CSP. Assurez-vous d'inclure votre copie de jQuery dans votre package, et liez-la avec l'attribut
src=""
d'une balise<script>
. - Mes templates ne sont pas rendus dans mon app priviliégiée packagée.
-
Si vous utilisez une bibliothèque de templating côté client (tel que Mustache ou Nunjucks), vous devez vous assurer de précompiler vos templates. Cela signifie que vous devez lancer un script pour compiler vos templates du HTML au JavaScript avant de packager votre app. Les apps privilégiées ne peuvent utiliser de chargeurs distants qui téléchargent et compilent des templates à la volée car le compilateur utilise
eval()
ounew Function()
, qui sont tous deux interdits. - J'ai configuré la CSP dans mon manifeste pour autoriser l'utilisation de [fonctionnalité], mais elle ne marche toujours pas.
- Vous ne pouvez pas adoucir les restrictions par défaut des apps packagées privilégiées ou certfiées. Le champ CSP dans le manifeste de l'app peut seulement être utilisé pour renforcer les restrictions de la CSP, pas pour les adoucir.
- Lorsque j'utilise certaines méthodes de jQuery, elles ne fonctionnenent pas comme attendu. Pourquoi ?
-
Certaines méthodes de jQuery - telles que celles qui chargent du JSON-P et du HTML distant - peut violer la CSP. Le code chargé loaded via JSON-P injecte une balise
<script>
dans la page, ce qui viole la CSP. Vous devriez utiliser des APIs CORS au lieu de JSON-P. jQuery va aussi tenter de télécharger et d'exécuter des scripts distants lors de l'utilisation de méthodes commeload()
ethtml()
, ce qui viole de la même façon la CSP en créant des balises<script>
. - J'ai besoin de lancer du code chargé depuis un domaine externe, mais je ne peux pas car c'est bloqué par la CSP.
-
Tentez de charger le code dans un
<iframe>
distant ou avec une URI de typedata:
et utilisezpostMessage()
pour transmettre et recevoir des messages du script. Les Iframes qui ne partagent pas l'origine de votre app ne sont pas soumis à la CSP. - Pourquoi mes événements click et hover ne sont-ils pas déclenchés ?
-
Si vous définissez des gestionnaires d'événements click ou hover avec
onclick=""
ouonmouseover=""
, votre code viole la CSP. Vous ne pouvez pas définir d'attributs d'événements dans une app privilégiée et packagée. Vous devriez utiliseraddEventListener()
à la place. - Lorsque je soumets mon app packagée au Marketplace, j'obtiens plusieurs avertissements de CSP (CSP warnings). Pourquoi ?
-
Le validateur du Marketplace essaie de détecter le code qui violerait la CSP. Il produit ces avertissements que votre app soit privilégiée ou pas. Ces avertissement sont conçus pour aider à pointer les potentiels violations de la CSP aux développeurs et aux reviewers du Marketplace. Dans plusieurs cas, les avertissements de CSP sont des faux positifs, mais ils peuvent également fournir du feedback utile pour améliorer le code de votre app. Les violations de CSP indiquent parfois un style de codage relâché et peuvent indiquer que vous devriez revoir votre travail.
Les avertissements de CSP du validateur N'impacteront PAS l'acceptation de votre app sur le Marketplace. Si votre app est privilégiée et elle viole la CSP, cependant, il vous sera demandé de corriger ce problème avant que votre app soit acceptée.