Chrome扩展程序"拒绝将字符串评估为JavaScript,因为' unsafe-eval'

时间:2014-07-17 08:37:27

标签: javascript json google-chrome-extension content-security-policy

我有一个错误:

  

拒绝执行内联脚本,因为它违反了以下内容安全性   政策指令:"script-src 'self' chrome-extension-resource:"。   'unsafe-inline'关键字,a   启用哈希('sha256-...')或随机数('nonce-...')   内联执行。

     

铬延伸://ldbpohccneabbobcklhiakmbhoblcpof/popup.html:1

     

拒绝将字符串评估为JavaScript,因为'unsafe-eval'是   以下内容安全性中不允许使用脚本源   政策指令:"script-src 'self' chrome-extension-resource:"

代码popup.js

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

清单:

{
  "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://*/*"]
  }]
}

弹出窗口:

<!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>

3 个答案:

答案 0 :(得分:13)

我收到此消息是因为Chrome不再允许内联脚本和内联事件处理程序(如onClick):必须将它们移动到外部JS文件(例如popup.js)和addEventListener()必须是用于将事件关联到DOM对象。

例如:

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

必须替换为:

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

在您的情况下,我在HTML中看不到任何JS,但您可以尝试一些事项:

  • 移动popup.js包含在。
  • 之前
  • 更正html(双头)。
  • 从清单中删除content_scripts部分。内容脚本应该针对页面内容执行,它们不是页面或浏览器动作弹出窗口中包含的JS文件。浏览器操作部分就足够了。

请参阅Chrome extension manifest V2 notes

答案 1 :(得分:3)

我有一个非常类似的问题。我没有使用任何内联脚本或内联事件处理程序,但仍然得到该错误。事实证明,jQuery在内部尝试评估此类请求的响应,这在Chrome扩展程序中是不允许的。在我的情况下,我使用prefs = getPreferences(Context.MODE_PRIVATE); editor = prefs.edit(); totalCount = prefs.getInt("counter", 0); if(totalCount == 10){ fullScreenAd2.show(); totalCount = 0; } else { totalCount++; } editor.putInt("counter", totalCount); editor.commit(); $.ajax()。我通过将dataType: 'json'更改为dataType,然后使用text手动解析JSON来解决了该问题。

另外值得一提的是,大多数jQuery API在解析时会尝试执行给定html字符串中包含的脚本,这会在Chrome扩展中使用时导致类似的错误。在这种情况下,需要在响应中显式转义脚本。以下是jQuery JSON.parse()文档的引用:

  

大多数接受HTML字符串的jQuery API都会运行HTML中包含的脚本。除非keepScripts显式为true,否则jQuery.parseHTML不会在已解析的HTML中运行脚本。但是,在大多数环境中仍然可以间接执行脚本,例如通过属性。呼叫者应该注意这一点,并通过清除或转发来自URL或cookie等来源的任何不受信任的输入来防范它。为了将来的兼容性,当keepScripts未指定或错误时,调用者不应依赖于运行任何脚本内容的能力。

请注意,由于Chrome对内联脚本评估的限制,这些点在Chrome扩展程序中使用时会出现问题。它们可能不会成立。

答案 2 :(得分:0)

我也面临这个问题。

我在index.html的{​​{1}}中放置了以下代码

head-tag

然后我将其移动到文件<script> var global = global || window; var Buffer = Buffer || []; var process = process || { env: { DEBUG: undefined }, version: [] } </script> 中,并在

中引用到script.js
index.html

仍然出现该错误,最后删除了<script src="./script.js"></script> 并解决了问题

./