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

Man*_*aSa 63 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 *">
Run Code Online (Sandbox Code Playgroud)

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

<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'; style-src 'self' 'unsafe-inline'; media-src *">
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Ash*_*odi 52

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

<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' http://* 'unsafe-inline'; script-src 'self' http://* 'unsafe-inline' 'unsafe-eval'" />
Run Code Online (Sandbox Code Playgroud)

或者除了你拥有的东西之外,你应该加上http://*两者style-src并且script-src如上所述在'self'之后添加

如果您的服务器包含Content-Security-Policy标头,标头将覆盖元.

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

Sim*_*mon 35

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 *">
Run Code Online (Sandbox Code Playgroud)

以下是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';** ">
Run Code Online (Sandbox Code Playgroud)

没有更多的错误!

  • 呼应 @IncredibleHat 对以下答案之一的评论,这会使您的网站容易受到跨站脚本 (XSS) 攻击。我强烈建议您查看下面的答案(/sf/answers/3758357501/) (3认同)

Roc*_*que 15

对于任何寻求完整解释的人,我建议您查看内容安全政策: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';** ">
Run Code Online (Sandbox Code Playgroud)

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

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

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


Man*_*aSa 14

解决了

script-src 'self' http://xxxx 'unsafe-inline' 'unsafe-eval'; 
Run Code Online (Sandbox Code Playgroud)

  • 你能解释一下吗?你能粘贴完整的元吗? (38认同)
  • 通过允许任何恶意插件/xss 注入内联和 eval 脚本,这有效地禁用了脚本的 CSP,这完全违背了启用 CSP 的全部目的。 (8认同)
  • @dyoser这是参考https://developer.chrome.com/extensions/contentSecurityPolicy#relaxing (2认同)

Ale*_*urt 13

完整的权限字符串

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

警告:这会使文档暴露在许多漏洞中。确保防止用户在控制台中执行代码或在封闭环境中(如Cordova应用程序)。


Mub*_*Ali 11

如果您使用头盔包,则只需将 contentSecurityPolicy: false 传递到头盔功能选项中,如下所示

app.use(
  helmet({
    contentSecurityPolicy: false,
  })
);
Run Code Online (Sandbox Code Playgroud)


小智 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'">
Run Code Online (Sandbox Code Playgroud)


Jam*_*son 5

为了详细说明这一点,添加

script-src 'self' http://somedomain 'unsafe-inline' 'unsafe-eval';
Run Code Online (Sandbox Code Playgroud)

像这样的元标记,

<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 *">
Run Code Online (Sandbox Code Playgroud)

修复错误。