简短回答:不,您不必在 Cordova 中添加 CSP。
我的特殊问题是在 config.xml 的访问源属性中明显缺乏对子域通配符的支持。请改用 subdomains="true"(见下文)。
更新:您应该将 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 sn-p 中注意到,如果源不是“*”,插件的源代码将简单地复制给定的源,并且它也会注意“子域”属性。
我在 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 请求工作。
我的平台是安卓。
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 标签的正确应用,我和你在同一条船上......并且将查看在线资源以找出答案。我想 Google 和 Apple 将来可能会需要适当的 CSP 标签。