如何正确定义Cordova中的Content-Security-Policy?

时间:2015-06-19 09:48:29

标签: cordova content-security-policy

我已经为我的Cordova应用程序定义了我的Content-Security-Policy已经困难了好几天了。

我的第一个问题是:我是否必须在Cordova中添加CSP?似乎Cordova默认为CSP添加了元标记并添加了Whitelist插件,需要为每个页面定义CSP。

如果我必须定义:

如何根据我的需要正确定义指令:

我正在添加一些js文件,css文件,并有内联js代码,以及样式。我已经为我的页面添加了这个CSP。它抱怨 style-src

<meta http-equiv="Content-Security-Policy" content="default-src *; script-src 'self' 'nonce-Random'; connect-src 'self'; img-src *; style-src *; media-src *"> 

我想知道如何为script-src,style-src,media-src,img-src正确添加CSP。我已经阅读了W3C草案。但无法弄清楚。

我还必须在科尔多瓦方面做点什么吗?

最好,

2 个答案:

答案 0 :(得分:6)

简答:不,您不必在Cordova中添加CSP。 我的特定问题在config.xml中的访问源属性中显然缺乏对子域通配符的支持。使用subdomains =&#34; true&#34;相反(见下文)。

  

更新:您 应该将CSP标记添加到您的HTML ...请参阅底部的注释......

<强>详细信息: 我也一直在搞乱这个问题,最后在查看白名单插件itself的源代码时找到了解决方案。

我注意到插件检查了config.xml文件中包含

的行
<access origin="*" />

并且在那种情况下添加了白名单条目(java代码):

if ("*".equals(origin)) {
    allowedRequests.addWhiteListEntry("http://*/*", false);
    allowedRequests.addWhiteListEntry("https://*/*", false);
} else {
    allowedRequests.addWhiteListEntry(origin, (subdomains != null) && (subdomains.compareToIgnoreCase("true") == 0));
}

表示它根据在config.xml中找到的内容创建CSP规则。

我将<access origin="" />添加到我的config.xml中,事情就开始了!

我在上面的java片段中注意到,如果原点不是&#34; *&#34;插件的源代码只是复制给定的来源,并且它也会注意到&#34;子域&#34;属性。

我查看了以前在config.xml中使用的访问定义:

<access origin="http://my.domain.com/*" />

我更改了所有这些以使用子域属性而不是通配符:

<access origin="http://my.domain.com" subdomains="true" />

然后我从之前移除了 <access origin="*" />行,一切都继续有效。

我还回到了我的html文件中并删除了我正在尝试的<meta http-equiv="Content-Security-Policy" ... >标签,并且事情继续发挥作用..即。 他们不需要 ...插件可以完成所有操作。 我应该注意到我的HTML中的上述CSP标签确实有一些效果,但我无法让它们为我的XMLHttpl请求工作。 我的平台是Android。 Cordova -v = 5.0.0(我从v 3.x.x升级)

您可能希望查看插件源的其余部分,因为它可能已更改或提示如何处理其他问题,例如: config.xml中的<allow-navigation href="*" />导致上述CSP(即"http://*/*""https://*/*")以及"data:*"

注意

运行cordova应用时,我从白名单插件收到警告:

  

未找到Content-Security-Policy元标记。请在使用时添加一个   cordova-plugin-whitelist插件

我认为这个插件打开了所有内容,你应该在你的html文件中使用CSP成为一个负责任且安全的编码器 - 这样做! ;)

我注意到,在你的问题的第二部分,你似乎试图将CSP打开......所以我的答案到目前为止应该足以让事情顺利进行。就CSP标签的正确应用而言,我和你在同一条船上......并且会在网上寻找资源来解决这个问题。我想谷歌和苹果可能在将来的某个时候需要适当的CSP标签。

答案 1 :(得分:3)

在Content Security Police标记的内容属性中,您可以定义每种源类型允许的网址:

例如,在 script-src 中添加允许加载脚本源的网址,以及'unsafe-inline'等值,这意味着您无法在应用上使用内联JavaScript代码。< / p>

使用*值,您允许您的应用从任何网址加载来源。

self值表示您的应用可以加载本地资源,例如

<script src='../js/script.js'></script>

语法类似于

script-src 'self' http://test.com/* http://hello.com/* 'unsafe-inline'; style-src 'self' http://hellocom/*