在 Chrome 扩展中被覆盖的新选项卡中使用 jQuery 是不是违反了内容安全策略?

Posted

技术标签:

【中文标题】在 Chrome 扩展中被覆盖的新选项卡中使用 jQuery 是不是违反了内容安全策略?【英文标题】:Using jQuery in overridden new tab, in Chrome Extension, violates Content Security Policy?在 Chrome 扩展中被覆盖的新选项卡中使用 jQuery 是否违反了内容安全策略? 【发布时间】:2015-07-01 13:18:35 【问题描述】:

我有一个 chrome 扩展程序,我用 html 文件“index.html”覆盖了 newtab。我想在这个 “index.html”上使用 jQuery。 我该怎么做?

这是我的简化代码:

manifest.json


    "name": "Test Name",
    "description": "Test Description",
    "version": "0.1",
    "chrome_url_overrides": 
        "newtab": "index.html"
    ,
    "manifest_version": 2,

index.html

<html>
    <head>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
        <script src="index.js"></script>
    </head>
    <body>
        <div> Hello World ! </div>
    </body>
</html>

index.js

console.log('Extension loaded successfully ...');
console.log($('div')); // console.log(jQuery('div'));

但是我在控制台中不断收到以下两个错误。

拒绝加载脚本 'https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js' 因为它违反了以下内容安全政策指令: "script-src 'self' chrome-extension-resource:".

扩展加载成功...

未捕获的引用错误:$ 未定义

更新:1我也尝试在清单文件中添加content security policy,但它不起作用,并且仍然产生错误:

"content_security_policy": "script-src 'self' https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js 'unsafe-eval'; object-src 'self'",

更新:2我也尝试在清单文件中添加权限,但它也不起作用,仍然是同样的错误:

"permissions": [ "http://*/", "https://*/" ]

我该如何解决这个问题?

【问题讨论】:

尝试本地文件版本的 jQuery 如果是本地文件,两个错误消失,但$('div')选择器返回空数组。 您必须在清单文档中提供权限、结帐权限和内容安全策略 @Mr.Alien 我在 manifest.json 中添加了以下行,但它也不起作用 "content_security_policy": "script-src 'self' ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js 'unsafe-eval'; object -src '自我'", 是的,它返回一个空数组只是因为代码是在 div 元素呈现之前执行的。 【参考方案1】:

您为 CSP 字符串使用了错误的格式。正确的是(注意没有路径):

"content_security_policy": "script-src 'self' https://ajax.googleapis.com 'unsafe-eval'; object-src 'self'"

但是,最好包含您在 Chrome 扩展程序中使用的库的本地副本,而不是依赖于 CDN。

想象一下您的新标签页由于连接不工作而完全无法正确加载,或者由于连接不良而加载缓慢。

【讨论】:

【参考方案2】:

尝试使用本地文件并使用 $( document ).ready() 运行您的 console.log,由于 DOM 尚未准备好,数组可能返回空:

$(document).ready(function()
    console.log($('div'));
)

【讨论】:

这适用于本地托管的 jQuery 文件。不适用于外部托管,即ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js @AshrafBashir 这就是readyload 事件之间的区别;)

以上是关于在 Chrome 扩展中被覆盖的新选项卡中使用 jQuery 是不是违反了内容安全策略?的主要内容,如果未能解决你的问题,请参考以下文章

上传到 Chrome 应用商店后,扩展程序不会在新选项卡中打开多个链接

Chrome 扩展程序 - 在新打开的选项卡中不起作用

是否可以在 Chrome Web 检查器网络选项卡中隐藏扩展资源?

单击工具栏图标时,在新选项卡中打开chrome扩展名

redux devtools 不在扩展 devtools 选项卡中显示状态

浏览器扩展是否可以读取网页的DOM而无需在选项卡中打开它?