【问题标题】:How to define Content-Security-Policy in Cordova properly?如何在 Cordova 中正确定义 Content-Security-Policy?
【发布时间】:2015-09-05 06:03:35
【问题描述】:

我已经为我的 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


    【解决方案1】:

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

    我将 &lt;access origin="" /&gt; 添加到我的 config.xml 中,一切都开始工作了!

    然后我在上面的 java sn-p 中注意到,如果源不是“*”,插件的源代码将简单地复制给定的源,并且它也会注意“子域”属性。

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

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

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

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

    然后我删除了之前的 &lt;access origin="*" /&gt; 行,一切都继续工作。

    我还回到了我的 html 文件并删除了我一直在尝试的 &lt;meta http-equiv="Content-Security-Policy" ... &gt; 标签,事情继续有效.. 即。 他们不需要...插件可以做到这一切。 我应该注意到,我的 HTML 中的上述 CSP 标记确实有一些效果,但我无法让它们为我的 XMLHttpl 请求工作。 我的平台是安卓。 Cordova -v = 5.0.0(我从 v 3.x.x 升级)

    您可能需要查看插件源的其余部分,因为它可能已更改或有关如何处理其他问题的提示,例如config.xml 中的 &lt;allow-navigation href="*" /&gt; 会产生上述 CSP(即 "http://*/*""https://*/*" )以及 "data:*"

    刚刚注意到

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

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

    我的意思是该插件会打开所有内容,并且您应该在 html 文件中使用 CSP 以成为负责任且安全的编码器 - 可以! ;)

    我注意到,在您问题的第二部分中,您似乎正试图将 CSP 设置为开放式......所以到目前为止我的回答应该足以让事情顺利进行。至于 CSP 标签的正确应用,我和你在同一条船上......并且将查看在线资源以找出答案。我想 Google 和 Apple 将来可能会需要适当的 CSP 标签。

    【讨论】:

    • 如果您提供插件cordova-plugin-whitelist,但不提供CSP,它将回退到访问和允许导航定义的config.xml文件。有关详细信息,请参阅raymondcamden.com/2015/05/25/… 仍然明确建议提供 CSP
    【解决方案2】:

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

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

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

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

    &lt;script src='../js/script.js'&gt;&lt;/script&gt;

    语法类似

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      • 2022-01-21
      • 2017-05-25
      • 2021-04-20
      相关资源
      最近更新 更多