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

问题描述 投票:0回答:3

我已经为我的 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 content-security-policy
3个回答
9
投票

简短回答: 不,您不必在 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 标签。


6
投票

在内容安全警察标签的 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/*


0
投票
<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 上进行购买。

© www.soinside.com 2019 - 2024. All rights reserved.