首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Chrome扩展“拒绝将字符串作为JavaScript求值,因为'unsafe-eval‘”

Chrome扩展“拒绝将字符串作为JavaScript求值,因为'unsafe-eval‘”
EN

Stack Overflow用户
提问于 2014-07-17 16:37:27
回答 3查看 33.9K关注 0票数 24

我有一个错误:

拒绝执行内联脚本,因为它违反了以下内容安全策略指令:"script-src 'self' chrome-extension-resource:"。启用内联执行需要'unsafe-inline'关键字、散列('sha256-...')或现时值('nonce-...')。

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

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

代码popup.js

代码语言:javascript
复制
$(document).ready(function() {
     $.getJSON('http://.......alerts.json', function(data) {
        alert('HELLO');
      });
});

清单:

代码语言:javascript
复制
{
  "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://*/*"]
  }]
}

弹出窗口:

代码语言:javascript
复制
<!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>
EN

回答 3

Stack Overflow用户

发布于 2014-08-20 10:06:50

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

例如:

代码语言:javascript
复制
<body onload="initialize()">
<button onclick="handleClick()" id="button1">

必须替换为:

代码语言:javascript
复制
window.addEventListener("load", initialize);
document.getElementById("button1").addEventListener("click",handleClick);

在您的示例中,我在HTML中看不到任何JS,但您可以尝试以下几种方法:

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

请参阅Chrome extension manifest V2 notes

票数 13
EN

Stack Overflow用户

发布于 2016-06-04 21:41:47

我也遇到过类似的问题。我没有使用任何内联脚本或内联事件处理程序,但仍然收到该错误。结果,jQuery内部试图评估这类请求的响应,而这在Chrome扩展中是不允许的。在我的例子中,我使用的是$.ajax()dataType: 'json'。我通过将dataType更改为text,然后使用JSON.parse()手动解析JSON解决了这个问题。

此外,值得一提的是,大多数Chrome在解析时尝试执行包含在给定jQuery字符串中的脚本,这会导致在中使用时出现类似的错误。在这种情况下,需要显式转义响应中的脚本。下面是jQuery parseHTML()文档中的一句话:

大多数接受jQuery字符串的HTML将运行包含在HTML中的脚本。除非keepScripts显式为真,否则jQuery.parseHTML不会在解析的超文本标记语言中运行脚本。但是,在大多数环境中,仍然可以间接执行脚本,例如通过属性。调用者应该意识到这一点,并通过清除或转义来自URL或cookies等来源的任何不受信任的输入来防范这种情况。为了将来的兼容性,当keepScripts未指定或为false时,调用者不应依赖于运行任何脚本内容的能力。

请注意,由于Chrome对内联脚本计算的限制,这些点在Chrome扩展中使用时会出现问题。它们可能不会在一般情况下成立。

票数 3
EN

Stack Overflow用户

发布于 2018-12-31 17:56:28

我也曾面对过这个问题。

我把下面的代码放在head-tagindex.html

代码语言:javascript
复制
<script>
    var global = global || window;
    var Buffer = Buffer || [];
    var process = process || {
      env: { DEBUG: undefined },
      version: []
    }
</script>

然后,我将其移动到文件script.js中,并在index.html中引用,如下所示

代码语言:javascript
复制
<script src="./script.js"></script>

仍然收到该错误,并最终删除了./并解决了问题

代码语言:javascript
复制
<script src="script.js"></script>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24798669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档