我已经为我的 Cordova 应用程序定义内容安全策略而苦苦挣扎了几天。
我的第一个问题是:我必须在 Cordova 中添加 CSP 吗? Cordova 似乎默认为 CSP 添加元标记并添加白名单插件,需要为每个页面定义 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 草案。但无法弄清楚。
我也必须在科尔多瓦方面做一些事情吗?
最好的,
简短回答: 不,您不必在 Cordova 中添加 CSP。 我的特殊问题是 config.xml 中的访问源属性明显缺乏对子域通配符的支持。使用 subdomains="true" 代替(见下文)。
更新:您应该将 CSP 标签添加到您的 html 中...请参阅底部的注释...
详情: 我也一直在搞乱这个问题,当我查看白名单插件本身的源代码时终于找到了解决方案。
我注意到插件检查了 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 代码片段中注意到,如果来源不是“*”,则插件的源代码将简单地复制给定的来源,并且它还会注意“子域”属性。
我查看了 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 应用程序时,我收到来自白名单插件的警告:
未找到内容安全策略元标记。使用时请添加1个 cordova-plugin-whitelist 插件
我的意思是,该插件打开了一切,您应该在 html 文件中使用 CSP,成为一个负责任且安全的编码器 - 会做的! ;)
我注意到,在你问题的第二部分中,你似乎试图将 CSP 完全开放......所以到目前为止我的回答应该足以让事情顺利进行。至于 CSP 标签的正确应用,我和您的情况一样......并且将查看在线资源来解决这个问题。我想 Google 和 Apple 可能在未来的某个时候需要适当的 CSP 标签。
在内容安全警察标签的 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/*
<meta http-equiv="Content-Security-Policy" content="default-src 'self' https: http://localhost:3000 https://*.iaptic.com 'unsafe-eval' 'unsafe-inline' gap://* app:
*; style-src 'self' 'unsafe-inline'; media-src *; img-src * 'self' data: blob:">
与 https://github.com/AraHovakimyan/cordova-plugin-wkwebviewxhrfix 结合使用,可以像魅力一样工作,用于在
localhost
/via file://
上加载资源(迄今为止唯一可用的插件, https://stackoverflow.com/a/77742602/11127383)
此外,这样的设置也适用于今天使用
https://github.com/j3k0/cordova-plugin-purchase在
Android
和 iOS
上进行购买。