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


99

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

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

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


与我的问题非常相似。我无法检索JSON文件,“因为它违反了以下内容安全策略指令:“ connect-src'self'””
Michael R

1
@MichaelR如果您想通过JS如tampermonkey插件或其他所有内容从JS中检索一些JSON信息,则可以使用此插件chrome.google.com/webstore/detail/disable-content-security/…并在希望获取时禁用CSP检查的东西。它虽然完全不安全,但在某些情况下可能会起作用。我在此发布此答案,因为我一直在寻找错误,并且该主题首先在Google中显示。
ErykWróbel18年

Answers:


65

请尝试使用以下代码替换您的元标记:

<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标头,则标头将覆盖元。


6
据我了解,您在此处定义的CSP会禁用所有类型的安全性以避免攻击,从而允许脚本标记以及从任何域以及通过不安全的连接加载脚本。请参阅developers.google.com/web/fundamentals/security/csp还是我能得到。错误?我猜想在大多数情况下(开发和调试除外),这不是您想要的...对吗?
Peter T.


9
我会否决这个答案,因为您建议使用“ unsafe-inline”“ unsafe-eval”,在使用CSP时不应该这样做!
HerTesla

39

MagngooSasa给出自我答案可以解决问题,但对于尝试理解答案的其他人,这里有一些详细信息:

使用Visual Studio 开发Cordova应用程序时,我尝试导入远程JavaScript文件[位于此处http://Guess.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';** ">

没有更多的错误!



7

我们使用了这个:

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

7

对于希望获得完整解释的任何人,我建议您看一下内容安全政策:https : //www.html5rocks.com/zh-CN/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';** ">

你是说你授权的Javacsript代码(执行script-src从起源)'self'http://onlineerp.solution.quebec'unsafe-inline''unsafe-eval'

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

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


为什么在我的本地主机页面中可以附加另一个主机脚本?
mqliutie

这并非罕见重用未在您的服务器托管的第三方脚本,但在其中“信任”
罗西奥·加西亚·卢克

6

完整的权限字符串

先前的答案无法解决我的问题,因为它们没有同时包含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应用程序的封闭环境中执行代码。


1
如果您尝试像这样在控制台中加载例如JQuery,这是正确的答案:stackoverflow.com/a/31912495/137948
Will Sheppard

4

要对此进行详细说明,请添加

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

这样的meta标签,

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

解决错误。


2

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

在我们的案例中,我们将Ngnix用作基于Tomcat 9 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,则不应在响应中添加标头。

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


-1

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

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

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


我有同样的问题。所以您建议从.gitignore删除/ build文件夹吗?
Hoang Minh,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.