拒绝加载脚本,因为它违反了以下内容安全策略指令

IT技术 javascript android cordova content-security-policy
2021-01-13 19:19:05

当我尝试将我的应用程序部署到 Android 系统高于 5.0.0 ( Lollipop ) 的设备时,我不断收到以下错误消息:

07-03 18:39:21.621: D/SystemWebChromeClient(9132): file:///android_asset/www/index.html: Line 0 : 拒绝加载脚本“http://xxxxx”,因为它违反了以下内容安全策略指令:“script-src 'self' 'unsafe-eval' 'unsafe-inline'”。07-03 18:39:21.621: I/chromium(9132): [INFO:CONSOLE(0)]“拒绝加载脚本‘http://xxx’,因为它违反了以下内容安全策略指令:”脚本- src 'self' 'unsafe-eval' 'unsafe-inline'"。

但是,如果我将其部署到 Android 系统为 4.4.x ( KitKat ) 的移动设备,则安全策略适用于默认策略:

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">

然后我想,也许,我应该改成这样:

<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'; style-src 'self' 'unsafe-inline'; media-src *">

基本上,这两种选择都不适合我。我该如何解决这个问题?

6个回答

MagngooSasa 给出自我回答解决了这个问题,但对于试图理解答案的其他人,这里有更多细节:

使用 Visual Studio开发Cordova应用程序时,我尝试导入远程 JavaScript 文件 [位于此处 http://Guess.What.com/MyScript.js],但出现标题中提到的错误。

这是项目的index.html文件中,之前meta标签

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">

这是更正的元标记,以允许导入远程脚本:

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *;**script-src 'self' http://onlineerp.solution.quebec 'unsafe-inline' 'unsafe-eval';** ">

没有更多的错误!

它是通过以下方式解决的:

script-src 'self' http://xxxx 'unsafe-inline' 'unsafe-eval';
这通过允许任何恶意插件/xss 注入内联和 eval 脚本有效地禁用了脚本的 CSP,这完全违背了启用 CSP 的全部目的。
2021-04-07 19:19:05
2021-04-11 19:19:05

对于任何寻求完整解释的人,我建议您查看内容安全政策:https : //www.html5rocks.com/en/tutorials/security/content-security-policy/

“来自https://mybank.com 的代码应该只能访问 https://mybank.com 的数据,而https://evil.example.com绝对不应该被允许访问。每个源都与其他源保持隔离网络”

XSS 攻击基于浏览器无法区分您的应用程序代码和从其他网站下载的代码。因此,您必须使用Content-Security-PolicyHTTP 标头将您认为可以安全下载内容的内容来源列入白名单

该策略使用一系列策略指令进行描述,每个指令描述特定资源类型或策略领域的策略。您的策略应该包含一个 default-src 策略指令,当其他资源类型没有自己的策略时,它是其他资源类型的后备。

因此,如果您将标签修改为:

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *;**script-src 'self' http://onlineerp.solution.quebec 'unsafe-inline' 'unsafe-eval';** ">

您是说您正在授权script-src从源'self'http://onlineerp.solution.quebec'unsafe-inline'执行 JavaScript 代码 ( ) 'unsafe-eval'

我想前两个完全适用于您的用例,我对其他的有点不确定。'unsafe-line''unsafe-eval'造成安全问题,因此除非您对它们有非常特殊的需求,否则不应使用它们:

“如果 eval 及其文本到 JavaScript 的兄弟对您的应用程序完全必要,您可以通过在 script-src 指令中添加'unsafe-eval'作为允许的源来启用它们。但是,再次,请不要。禁止执行字符串的能力使攻击者更难在您的站点上执行未经授权的代码。” (迈克·韦斯特,谷歌)

为什么在我的本地主机页面中我可以附加另一个主机脚本?
2021-03-29 19:19:05
重用未托管在您的服务器中但您“信任”的第 3 方脚本并不少见
2021-04-03 19:19:05

完整的权限字符串

以前的答案没有解决我的问题,因为它们没有同时包含blob: data: gap:关键字;所以这是一个字符串:

<meta http-equiv="Content-Security-Policy" content="default-src * self blob: data: gap:; style-src * self 'unsafe-inline' blob: data: gap:; script-src * 'self' 'unsafe-eval' 'unsafe-inline' blob: data: gap:; object-src * 'self' blob: data: gap:; img-src * self 'unsafe-inline' blob: data: gap:; connect-src self * 'unsafe-inline' blob: data: gap:; frame-src * self blob: data: gap:;">

警告:这会使文档暴露在许多漏洞中。一定要防止用户在控制台中执行代码或在像Cordova应用程序这样的封闭环境中

尽管允许所有来源违背了此安全功能的目的,但它确实帮助我根据需要设置了正确的来源。
2021-03-13 19:19:05
我知道这是无关的,但它没有解决我的 paypal js sdk 问题,它仍然返回:拒绝将文档的基本 URI 设置为“ paypalobjects.com/web/res/c30/165e8147117bd1483979affdece85 ”,因为它违反了以下内容安全政策指令:“base-uri 'self' https://*.paypal.com”。
2021-04-08 19:19:05
如果您尝试像这样在控制台中加载例如 JQuery,这是正确的答案:stackoverflow.com/a/31912495/137948
2021-04-10 19:19:05
@Thiago 尝试追加 ;base-uri * self 'unsafe-inline' blob: data: gap:;
2021-04-11 19:19:05

我们使用了这个:

<meta http-equiv="Content-Security-Policy" content="default-src gap://ready file://* *; style-src 'self' http://* https://* 'unsafe-inline'; script-src 'self' http://* https://* 'unsafe-inline' 'unsafe-eval'">
对于 js 爱好者:document.getElementsByTagName('head')[0].innerHTML += '<meta http-equiv="Content-Security-Policy" content="default-src gap://ready file://* *; style-src \'self\' http://* https://* \'unsafe-inline\'; script-src \'self\' http://* https://* \'unsafe-inline\' \'unsafe-eval\'">';`
2021-03-31 19:19:05