Modules

Content Security Policy

Les extensions développées avec les API WebExtension ont une politique de sécurité du contenu (CSP) qui leur est appliquée par défaut. Cela limite les sources à partir desquelles ils peuvent charger les ressources <script> et <object>, interdit les pratiques potentiellement dangereuses telles que l'utilisation de eval().

Cet article explique brièvement ce qu'est un CSP, quelle est la politique par défaut et ce que cela signifie pour une extension, et comment une extension peut changer le CSP par défaut.

La Politique de sécurité de contenu (CSP) est un mécanisme qui empêche les sites Web d'exécuter involontairement du contenu malveillant. Un site Web spécifie un CSP utilisant une en-tête HTTP envoyé par le serveur. Le CSP est principalement concerné par la spécification de sources légitimes de différents types de contenu, tels que des scripts ou des plugins intégrés. Par exemple, un site Web peut l'utiliser pour spécifier que le navigateur ne doit exécuter que du JavaScript provenant du site Web lui-même, et non d'autres sources. Un  CSP peut également ordonner au navigateur d'interdire les pratiques potentiellement dangereuses, telles que l'utilisation de eval().

Comme les sites Web, les extensions peuvent charger du contenu provenant de différentes sources. Par exemple, une fenêtre d'action d'un navigateur est spécifiée en tant que document HTML, et elle peut inclure du JavaScript et du CSS provenant de différentes sources, tout comme une page Web normale :

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8">
  </head>

  <body>

    <!--Some HTML content here-->

    <!--
      Include a third-party script.
      See also https://developer.mozilla.org/fr/docs/Web/Security/Subresource_Integrity.
    -->
    <script
      src="https://code.jquery.com/jquery-2.2.4.js"
      integrity="sha256-iT6Q9iMJYuQiMWNd9lDyBUStIq/8PuOW33aOqmvFpqI="
      crossorigin="anonymous">
    </script>
 
    <!-- Include my popup's own script-->
    <script src="popup.js"></script>
  </body>

</html>

Par rapport à un site Web, les extensions ont accès à d'autres API privilégiées. Par conséquent, si elles sont compromises par un code malveillant, les risques sont plus grands. Pour cette raison:

  • Une politique de sécurité du contenu assez stricte est appliquée aux extensions par défaut. Voir la politique de sécurité du contenu par défaut.
  • L'auteur de l'extension peut modifier la stratégie par défaut à l'aide de la clé content_security_policy du manifest.json, mais il existe des restrictions sur les stratégies autorisées. Voir content_security_policy.

Stratégie de sécurité du contenu par défaut

La stratégie de sécurité du contenu par défaut pour les extensions est la suivante :

"script-src 'self'; object-src 'self';"

Ceci sera appliqué à toute extension qui n'a pas explicitement défini sa propre stratégie de sécurité de contenu à l'aide de la clé content_security_policy du manifest.json. Cela a les conséquences suivantes :

Emplacement du script et des ressources de l'objet

Sous le CSP par défaut, vous pouvez charger que les ressources <script> et <object> qui sont locales à l'extension. Par exemple, considérez une ligne comme celle-ci dans le document d'une extension :

 <script src="https://code.jquery.com/jquery-2.2.4.js"></script>

Cela ne chargera plus la ressource demandée: elle échouera silencieusement et tout objet attendu de la ressource ne sera pas trouvé. Il y a deux solutions principales à cela :

  • Téléchargez la ressource, empaquetez-la dans votre extension et reportez-vous à cette version de la ressource

  • Utilisez la clé content_security_policy pour autoriser l'origine distante dont vous avez besoin.

eval() et amis

Sous les extensions CSP par défaut ne sont pas autorisés à évaluer les chaînes en JavaScript. Cela signifie que les éléments suivants ne sont pas autorisés :

eval("console.log('some output');");
window.setTimeout("alert('Hello World!');", 500);
var f = new Function("console.log('foo');");

JavaScript intégré

Sous le CSP en ligne par défaut, Javascript n'est pas exécuté. Cela interdit à la fois JavaScript placé directement dans les balises <script> et les gestionnaires d'événements en ligne, ce qui signifie que les éléments suivants ne sont autorisés :

<script>console.log("foo");</script>
<div onclick="console.log('click')">Click me!</div>

Si vous utilisez actuellement du code comme <body onload="main()"> pour exécuter votre script lorsque la page est chargée, écoutez DOMContentLoaded ou load à la place.

Étiquettes et contributeurs liés au document

Étiquettes : 
 Contributeurs à cette page : hellosct1
 Dernière mise à jour par : hellosct1,