这是相对于Chrome扩展程序。我正在尝试使用Google Chart API的简单方法
我在我的html文档“popup.html”中有这个代码,它是在点击图标时加载的。
<!doctype html>
<html>
<head>
<script type="text/javascript" src="js/libs/jquery-1.8.0.min.js"></script>
<script type="text/javascript" src="js/popup.js"></script>
<script type="text/javascript" src="http://www.google.com/jsapi?key=xxxxxxxxxxx"></script>
[...]
</body>
</html>
我收到以下消息:
拒绝加载脚本'http://www.google.com/jsapi?key=xxxxxxxxxxx',因为它违反了以下内容安全政策指令:“script-src'self'chrome-extension-resource:”。
我知道这是与权限有关的东西,我试图修改我的Manifest文件但没有成功:
{
[...]
"manifest_version": 2,
"permissions": ["http://*.google.com/"],
"content_security_policy": "script-src 'self' http://www.google.com; object-src 'self'",
}
有什么想法吗?
答案 0 :(得分:28)
在过去的12个小时里我一直在努力解决这个问题,并最终让它发挥作用。为什么需要这么长时间?因为我多次被抛弃了。首先,假导致:
“将其设为HTTPS” - 无所谓。我的Chrome扩展程序现在可以定期对其他域进行HTTP调用,并且运行正常。 (更新:更多澄清。“make it https”神话根植于人们在SCRIPT加载时会遇到的类似问题。如果你需要引入一个外部.js文件,那么是的,你需要修改你的content_security_policy并包含正确的主机名,它似乎只接受https。请记住,这与点击REST服务之类的外部主机名不同。正如我之前所说,这不需要修改content_security_policy,也不需要修改https。 )
“在JQuery AJAX调用中使用JSONP” - 这可能是在普通网页中解决跨域AJAX的一种方法,但由于内置的内部安全性,在Chrome扩展中不是必需的政策。此外,实现JSONP听起来像PITA,因为它需要服务器端更改来处理回调参数(或者其他东西,我仍然不确定)。无论如何,没有必要。
“与扩展中的内容安全策略(CSP)字符串混淆” - 在清单版本2下,默认字符串工作正常:“script-src'self'; object-src'self'”。您甚至不必明确指定它。您需要的是将您尝试从扩展名中搜索的域名包含为“权限”值。
解决方案:
从您的扩展程序中删除所有内联JavaScript。将其放入单独的.js文件中。我怀疑对于大多数具有任何相当数量的javascript的html文件,这个过程会很糟糕。对我来说幸运的是,我所拥有的只是一个onload,我可以将其作为window.addlistener onload事件移动到一个单独的js文件中。
您真正需要阅读以解决此问题的页面位于:https://developer.chrome.com/apps/contentSecurityPolicy
答案 1 :(得分:22)
只需使用https
协议即可。您收到的错误与Content Security Policy相关。
请参阅页面的Relaxing the default policy
部分。它提到您只能将HTTPS
,chrome-extension
和chrome-extension-resource
列入白名单。
答案 2 :(得分:0)
当我运行Augury chrome扩展程序调试Angular应用时,出现此错误[Report]。 禁用扩展名,错误消失。这不会帮助正在编写扩展程序的人,但可能会帮助那些没有编写扩展程序的人。
[Report Only] Refused to load the script 'https://apis.google.com/js/googleapis.proxy.js?onload=startup' because it violates the following Content Security Policy directive: "script-src 'report-sample' 'nonce-EagvF0PX1Z3gVL2Dka1hbA' 'unsafe-inline' 'strict-dynamic' https: http:". 'strict-dynamic' is present, so host-based whitelisting is disabled. Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback.