由于Content Security Policy指令,Extension拒绝加载脚本

Mah*_*shi 49 jquery google-chrome google-chrome-extension content-security-policy

以下是我的HTML代码

脚本:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="background.js"></script>
Run Code Online (Sandbox Code Playgroud)

HTML:

      <button name="btnlogin" id="btnlogin">Login</button><br/><br/>
Run Code Online (Sandbox Code Playgroud)

以下是js

$(document).ready(function(){
document.getElementById("#btnlogin").click(function(){
   alert("s");
 });
});
Run Code Online (Sandbox Code Playgroud)

清单文件:

{
"manifest_version": 2,
"name": "One-click Kittens",
"description": "This extension demonstrates a 'browser action' with kittens.",
 "version": "1.0",
"browser_action": {
"default_icon": "icon.png",
"default_popup": "popup.html"
},
}
Run Code Online (Sandbox Code Playgroud)

我发现当我在浏览器中运行此代码而不是正确显示警报时,但当我将其作为chrome扩展程序运行时,它会给我以下错误.

未捕获的ReferenceError:$未定义

拒绝加载脚本' http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js ',因为它违反了以下内容安全策略指令:"script-src'self'chrome -extension资源".

我不明白这些错误是什么.请帮我理解扩展..

谢谢

aps*_*ers 62

在Chrome扩展程序中,扩展程序中的扩展程序的内容安全策略(CSP)必须明确允许外部脚本源:

如果您需要一些外部JavaScript或对象资源,您可以通过将应该接受脚本的安全源列入白名单来放宽策略...

允许通过HTTPS从example.com加载脚本资源的宽松策略定义可能如下所示:

"content_security_policy":"script-src 'self' https://example.com; object-src 'self'"
Run Code Online (Sandbox Code Playgroud)

脚本只能通过HTTPS加载到扩展中,因此您必须通过HTTPS加载jQuery CDN资源:

<script src="https://ajax.googleapis.com/..."></script>
Run Code Online (Sandbox Code Playgroud)

并将修改后的CSP添加到清单中以允许该HTTPS资源:

{
    "manifest_version": 2,
    "name": "One-click Kittens",
    "description": "This extension demonstrates a 'browser action' with kittens.",
    "version": "1.0",
    "browser_action": {
        "default_icon": "icon.png",
        "default_popup": "popup.html"
    },
    "content_security_policy": "script-src 'self' https://ajax.googleapis.com; object-src 'self'"
}
Run Code Online (Sandbox Code Playgroud)

然而,对于您的特定情况,更好的解决方案是在本地扩展中包含jQuery,而不是从Internet加载(例如,您的扩展目前不能脱机工作).只需在您的扩展文件夹中包含jQuery的副本,并在脚本标记中使用相对路径引用它.假设您的jQuery库和HTML弹出文件位于同一子目录中,只需执行以下操作:

<script src="jquery-x.y.z.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

  • 多个URL看起来像这样:`"content_security_policy":"script-src'self'https://example.com https://anotherexample.com; object-src'self'"` (7认同)
  • 如果您需要允许多个网址怎么办?我没有看到如何在文档中实现这一点的任何示例. (4认同)
  • 知道如何在 "manifest_version": 3 处执行此操作吗? (4认同)
  • @TheMuffinMan用空格分隔它们.请注意,CSP是Chrome aops/extensions借用的通用Web标准; 一般来说,你可能有更好的运气寻找CSP文档/语法. (3认同)
  • @AdityaC自从我完成Chrome扩展开发以来已经有一段时间了,但我不认为对非脚本资源有严格的HTTPS要求.只需将域添加到您的权限并获取JSON即可.您需要共享代码(在新问题中)和您的特定错误. (2认同)
  • 并且确保不要像我愚蠢的那样在域之后放一个斜线... (2认同)