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

时间:2015-07-03 16:51:18

标签: javascript android cordova content-security-policy

当我尝试将我的应用程序部署到Android系统5.0.0以上的设备上时,我不断收到此类错误消息:

  

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

但是,如果我将其部署到Android系统为4.4.x的移动设备上,则安全策略可以使用默认策略:

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

基本上,这两个选项对我来说都不适用。有没有人知道如何解决这个问题?

谢谢!

9 个答案:

答案 0 :(得分:43)

尝试使用以下内容替换您的元标记:

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

或者除了您拥有的内容之外,您应该http://*同时向style-srcscript-src添加Content-Security-Policy,如上所述,在自我&#39;

之后添加

如果您的服务器包含{{1}}标头,则标头将覆盖元。

答案 1 :(得分:33)

MagngooSasa提供的自动答案可以解决这个问题,但对于其他试图理解答案的人来说,这里有一些细节:

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

这是项目的index.html文件中的元标记BEFORE

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

这是CORRECTED元标记,允许导入远程脚本:

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

并且没有更多错误!

答案 2 :(得分:13)

解决了

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

答案 3 :(得分:4)

我们使用了这个:

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

答案 4 :(得分:3)

详细说明此添加

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

修复错误

答案 5 :(得分:2)

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

  

“来自https://mybank.com的代码只能访问   https://mybank.com的数据,而https://evil.example.com应该   当然永远不会被允许访问。每个来源都与   网络的其余部分”

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

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

我想前两个对于您的用例是完全有效的,我不确定其他两个。 'unsafe-line''unsafe-eval'带来了安全性问题,因此,除非对它们有非常特定的需求,否则不要使用它们:

  

“如果eval及其从文本到JavaScript的弟兄们是完全必要的   在您的应用程序中,您可以通过添加“ unsafe-eval”作为   script-src指令中允许的源。但是,再次请不要。   禁止执行字符串的能力使其变得更加困难   让攻击者在您的网站上执行未经授权的代码。”(Mike West,Google)

答案 6 :(得分:0)

添加元标记以忽略此策略并没有帮助我们,因为我们的网络服务器正在响应中注入Content-Security-Policy标头。

在本例中,我们将Ngnix用作基于tomcat9 java的应用程序的Web服务器。从Web服务器开始,它指示浏览器不允许inline scripts,因此对于临时测试,我们通过以下方式关闭了Content-Security-Policy:评论。

如何在ngnix中关闭?

  • 默认情况下,ngnix 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,则不应在响应中添加标头。

  

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

答案 7 :(得分:0)

完整权限字符串

以上答案无法解决我的问题,因为它们不同时包含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' 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;">

警告:这会将文档暴露给许多漏洞,请确保阻止用户在控制台中执行代码或在Cordova应用程序之类的封闭环境中进行操作。

答案 8 :(得分:-2)

出现此错误的可能原因很可能是因为您已经将 / build 文件夹添加到.gitignore文件中,或者通常没有将其检入到Git中。

因此,当您Git推送Heroku master时,您引用的build文件夹不会被推送到Heroku。这就是为什么它显示此错误的原因。

这就是它在本地正常运行的原因,但是当您部署到Heroku时却不能。