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

当我试图将我的应用程序部署到安卓系统高于5.0.0(棒棒糖)的设备上时,我总是收到这样的错误消息:

07-0318:39:21.621: D/SystemWebChromeClient (9132) : File:///android _ asset/www/index.html: 第0行: 拒绝加载 脚本“ http://xxxxx”,因为它违反了以下内容 安全策略指令: “ script-src‘ self’‘ safe-eval’ ‘不安全-内联’”。07-0318:39:21.621: I/Cr (9132) : [ INFO: CONSOLE (0)]“拒绝加载‘ http://xxx’脚本,因为它 违反以下内容安全策略指令: “ script-src ’自我’’不安全-评估’’不安全-内联’”。

然而,如果我将它部署到安装了4.4. x (奇巧) Android 系统的移动设备上,安全策略会与默认策略一起工作:

<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 *">

基本上,这两种选择对我来说都不适用。我该如何解决这个问题呢?

621641 次浏览

解决办法是:

script-src 'self' http://xxxx 'unsafe-inline' 'unsafe-eval';

自我回答做到了这一点,但对于其他试图理解答案的人来说,这里有一些更多的细节:

在使用 Visual Studio 开发 科尔多瓦应用程序时,我试图导入一个远程 JavaScript 文件[位于 http://闻。[ what.com/myscript.js ] ,但是我有标题中提到的错误。

下面是项目 index.html 文件中的 超能力者标记 之前:

<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 标记,用于导入远程脚本:

<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://somedomain 'unsafe-inline' 'unsafe-eval';

就像这样,

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

修正错误。

我们用了这个:

<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'">

对于那些希望获得完整解释的人,我建议您查看一下内容安全策略: https://www.html5rocks.com/en/tutorials/security/content-security-policy/

”来自 https://mybank.com的代码只能访问 Https://mybank.com’s 数据,而 ABc0应该 当然绝不允许进入。每个来源保持隔离 网络的其他部分”

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

此策略使用一系列策略指令进行描述,其中每个指令都描述特定资源类型或策略区域的策略。您的策略应该包含 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';** ">

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

我想前两个对于您的用例来说是完全有效的,我对其他两个有点不确定。'unsafe-line''unsafe-eval'会造成安全问题,所以你不应该使用它们,除非你有一个非常特殊的需要:

”如果 eval 和它的文本到 JavaScript 的同类是完全必要的 在应用程序中,可以通过添加“不安全-eval”作为 在 script-src 指令中允许源代码。 禁止执行字符串的能力使得执行字符串变得更加困难 让攻击者在你的网站上执行未经授权的代码。”(麦克 · 韦斯特,谷歌)

添加 meta 标记来忽略这个策略对我们没有帮助,因为我们的 webserver 在响应中注入了 Content-Security-Policy头。

在我们的示例中,我们使用 Nnix 作为基于 Java 的应用程序的 Web 服务器。从网络服务器,它是指示浏览器不允许 inline scripts,所以对于一个临时测试,我们已经关闭了 Content-Security-Policy的评论。

如何在 ngnix 关掉它

  • 默认情况下,nnix Ssl.conf文件将在响应中添加一个头:

    #> grep 'Content-Security' -ir /etc/nginx/global/ssl.conf add_header Content-Security-Policy "default-src 'none'; frame-ancestors 'none'; script-src 'self'; img-src 'self'; style-src 'self'; base-uri 'self'; form-action 'self';";

  • 如果只是注释这一行并重新启动 ngnix,那么它不应该向响应添加标头。

如果您担心安全或生产,请不要 遵循这些步骤,仅用于测试目的并继续前进。

完整权限字符串

以前的答案没有解决我的问题,因为它们没有同时包含 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:;">

警告: 这将文档暴露给许多漏洞。一定要防止用户在控制台中执行代码,或者像 科尔多瓦应用程序一样处于封闭环境中。

出现此错误的可能原因是您已经将 /建造文件夹添加到了。或者通常没有将它签入到 Git 中。

因此,当你的 Git 按下 abc 0 master 时,你所引用的 build 文件夹不会被推到 Heroku。这就是为什么它会显示这个错误。

这就是为什么它可以在本地正常工作,但是当你部署到 Heroku 的时候就不行了。

对于像我这样使用 Apache/Debian 服务器的笨蛋来说,他们试图将这个文件添加到 index.html 文件中(因此损失了几个小时) ,答案可能是这样的:

编辑: /etc/apache2/sites-available/yourwebsiteconfig.com-ssl.conf

增加或修改以下内容:

Header always set Content-Security-Policy: "script-src 'self' 'unsafe-inline' 'unsafe-eval' data: https://www.googletagmanager.com"

这里:

<IfModule mod_headers.c>
Header always append X-Frame-Options SAMEORIGIN
Header always set Content-Security-Policy: "script-src 'self' 'unsafe-inline' 'unsafe-eval' data: https://www.googletagmanager.com"
</IfModule>

如果您正在使用头盔包,那么只需像下面这样将 contentSecurityPolicy: false 传递到 helment 函数选项

app.use(
helmet({
contentSecurityPolicy: false,
})
);