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

amo*_*l01 6 cordova content-security-policy

我已经为我的Cordova应用程序定义了我的内容安全策略已经困难了几天.

我的第一个问题是:我是否必须在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 *"> 
Run Code Online (Sandbox Code Playgroud)

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

我也必须在Cordova方面做点什么吗?

最好,

JJo*_*nes 6

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

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

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

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

<access origin="*" />
Run Code Online (Sandbox Code Playgroud)

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

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

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

我添加<access origin="" />到我的config.xml,事情开始工作!

然后我在上面的java片段中注意到,如果原点不是"*",则插件的源代码将简单地复制给定的原点,并且还需要注意"子域"属性.

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

<access origin="http://my.domain.com/*" />
Run Code Online (Sandbox Code Playgroud)

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

<access origin="http://my.domain.com" subdomains="true" />
Run Code Online (Sandbox Code Playgroud)

然后我<access origin="*" />从之前删除了一行,一切都继续工作.

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

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

刚刚注意到:

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

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

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

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


小智 5

在Content Security Police 标签的content属性中,您定义每个源类型允许的 url:

例如,在script-src 中,您添加允许加载脚本源的 url,这样的值'unsafe-inline'意味着您不能在您的应用程序上使用内联 javascript 代码。

有了这个*值,你就允许你的应用从任何 url 加载源。

self值意味着您的应用程序可以加载本地资源,例如

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

语法就像

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