web-dev-qa-db-fra.com

Extension Chrome "Refuse d'évaluer une chaîne en JavaScript car" unsafe-eval "

J'ai une erreur:

Refusé d'exécuter un script en ligne car il enfreint la sécurité de contenu suivante Directive de politique: "script-src 'self' chrome-extension-resource:". Soit le mot clé 'unsafe-inline', un hash ('sha256-...') ou un nonce ('nonce-...') est requis pour activer exécution en ligne.

extension-chrome: //ldbpohccneabbobcklhiakmbhoblcpof/popup.html: 1

Refusé d’évaluer une chaîne au format JavaScript car 'unsafe-eval' est pas une source de script autorisée dans la sécurité de contenu suivante Directive de politique: "script-src 'self' chrome-extension-resource:".

le code popup.js

$(document).ready(function() {
     $.getJSON('http://.......alerts.json', function(data) {
        alert('HELLO');
      });
});

Manifeste:

{
  "manifest_version": 2,

  "name": "Alert",
  "description": "This extension for  .",
  "version": "2.0",
  "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
  "permissions": [
    "http://www.......il/"
  ],
  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html"
  },
  "content_scripts": [ {
    "js": [ "jquery.min.js", "popup.js" ],
    "matches": [ "http://*/*", "https://*/*"]
  }]
}

Apparaitre:

<!doctype html>
<html>
  <head>
    <title>Getting Started Extension's Popup</title>
    <style>
      body {
        min-width: 357px;
        overflow-x: hidden;
      }

      img {
        margin: 5px;
        border: 2px solid black;
        vertical-align: middle;
        width: 75px;
        height: 75px;
      }
    </style>
     <head>
     <script src='jquery.min.js'></script>
     <script src='popup.js'></script>
</head>
  </head>
  <body>
  </body>
</html>
23
Vitaly Menchikovsky

J'avais ce message car Chrome n'autorisait plus les scripts et le gestionnaire d'événements intégrés (comme onClick): ils devaient être déplacés vers un fichier JS externe (par exemple, popup.js) et addEventListener () devait être utilisé pour associer des événements. Objets DOM.

Par exemple:

<body onload="initialize()">
<button onclick="handleClick()" id="button1">

doit être remplacé par:

window.addEventListener("load", initialize);
document.getElementById("button1").addEventListener("click",handleClick);

Dans votre cas, je ne vois aucun JS dans le code HTML, mais vous pouvez essayer certaines choses:

  • move popup.js inclut juste avant le.
  • corrigez le html (double tête).
  • supprimez la section content_scripts du manifeste. Les scripts de contenu sont supposés être exécutés par rapport au contenu de la page. Ils ne sont pas le fichier JS inclus dans la fenêtre contextuelle de la page ou de l'action du navigateur. La section d'action du navigateur devrait suffire.

Voir Notes sur l'extension du manifeste de la V2 dans Chrome

13
jeanM

J'ai eu un problème très similaire. Je n'utilisais pas de scripts en ligne ni de gestionnaires d'événements en ligne, mais j'entendais toujours cette erreur. En fin de compte, jQuery tente en interne d’évaluer la réponse à de telles demandes, ce qui n’est pas autorisé dans les extensions Chrome. Dans mon cas, j'utilisais $.ajax() avec dataType: 'json'. J'ai résolu le problème en remplaçant dataType par text, puis en analysant manuellement JSON à l'aide de JSON.parse().

De plus, il est utile de mentionner que la plupart des API jQuery tentent d'exécuter des scripts inclus dans une chaîne html donnée lors de l'analyse syntaxique, ce qui provoque des erreurs similaires lors de l'utilisation dans une extension Chrome. L'échappement explicite des scripts dans les réponses est requis dans de tels cas. Voici une citation de la documentation de jQuery parseHTML():

La plupart des API jQuery qui acceptent les chaînes HTML exécuteront des scripts inclus dans le code HTML. jQuery.parseHTML n'exécute pas de scripts dans le code HTML analysé, sauf si keepScripts est explicitement à true. Cependant, il est toujours possible dans la plupart des environnements d'exécuter des scripts indirectement, par exemple via l'attribut. L'appelant doit en être conscient et se prémunir contre cela en nettoyant ou en évitant toute entrée non approuvée provenant de sources telles que l'URL ou les cookies. Pour assurer la compatibilité future, les appelants ne doivent pas dépendre de la possibilité d’exécuter un contenu de script lorsque keepScripts est non spécifié ou est faux.

Veuillez noter que ces points posent des problèmes lorsqu’ils sont utilisés dans une extension Chrome en raison de la restriction de Chrome concernant l’évaluation de scripts en ligne. Ils pourraient ne pas être vrai en général.

3
Cashif Ilyas

Moi aussi j'ai fait face à ce problème.

Je mettais le code suivant dans index.html dans head-tag

<script>
    var global = global || window;
    var Buffer = Buffer || [];
    var process = process || {
      env: { DEBUG: undefined },
      version: []
    }
</script>

puis j'ai déplacé ceci dans le fichier i.e. script.js et référencé dans index.html comme 

<script src="./script.js"></script>

toujours eu cette erreur et finalement supprimé ./ et le problème résolu

<script src="script.js"></script>
0
WasiF