【问题标题】:How to allow remote image src URLs in Apache Cordova app如何在 Apache Cordova 应用程序中允许远程图像 src URL
【发布时间】:2021-04-02 15:08:26
【问题描述】:

我正在将 create-react-app 迁移到 Apache Cordova。我的静态图像的相对 URL 正在工作。例如:./images/path/to/file.jpeg

但在 iOS 模拟器中,我无法在 S3 存储桶中引用远程图像源。例如://s3-us-west-2.amazonaws.com/bla/bla/bla/8CCE-B64FD7247407.jpeg?1617374606

我认为这是一个安全配置问题,但我不确定。这是我的 config.xml 文件中当前的内容:

    <access origin="*" allows-local-networking='true' />
    <allow-intent href="http://*/*" />
    <allow-intent href="https://*/*" />
    <allow-intent href="tel:*" />
    <allow-intent href="sms:*" />
    <allow-intent href="mailto:*" />
    <allow-intent href="geo:*" />
    <allow-intent href="*" />
    <platform name="android">
        <allow-intent href="market:*" />
    </platform>
    <platform name="ios">
        <allow-intent href="itms:*" />
        <allow-intent href="itms-apps:*" />
        <allow-intent href="*" />
    </platform>

我的 index.html 文件中目前没有 &lt;meta http-equiv="Content-Security-Policy" content="..."&gt;

我做错了什么?

更新 1 和 2

我尝试更新我的 config.xml 文件以包含:

<allow-intent href="//:*/*" />
<access origin='*' allows-arbitrary-loads-for-media='true' allows-arbitrary-loads-in-web-content='true' allows-local-networking='true' />

很遗憾,这不起作用。

就像@DaveAlden 建议的那样,看起来这可能是一个 CSP 问题...

我的原始 index.html 文件根本不包含 Content-Security-Policy 元标记,但是当我在浏览器中运行 cordova 应用程序并查看源代码时。这是我看到的:

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; media-src *; img-src 'self' data: content:;">

现在我想我的问题是:CSP 来自哪里?还有,如何修改?

有一段时间我一直在摸索为什么远程图像在浏览器中工作,因为我的理解是img-src 'self' 应该不允许&lt;img src="//:bla-bla.amazonaws.com/bla/bla" /&gt;。我认为部分解释是,当我使用开发工具检查文档的&lt;head&gt; 时,我看到的 CSP 标记与查看源代码时不同。 ??????在运行cordova run ...之前,此 CSP 与我当前在 index.html 文件中的内容相匹配。

似乎 Cordova 以某种方式为 iOS 使用了不同的默认 CSP,但不知何故在浏览器中覆盖了它。我很困惑。

** 更新 3**

我搜索了我的项目文件,发现神秘的 CSP(我在浏览器中看到的)与 cordova-plugin-whitelist README 中列出的默认“模板”策略相匹配。

【问题讨论】:

  • @DaveAlden 我的 index.html 中目前没有 CSP 元标记。我认为这会导致最大的宽容度。这不正确吗?
  • @DaveAlden 我用更多与 CSP 相关的线索更新了问题。好像是被神秘地注入了……

标签: cordova phonegap content-security-policy


【解决方案1】:

更改您的 CSP
img-src 'self'

img-src *

【讨论】:

  • 对。我的问题是我怎样才能做到这一点? Cordova 似乎正在注入它自己的 CSP 规则,这些规则覆盖了我尝试设置的规则。
  • 在我的 index.html 文件的 meta 中设置它时,我没有遇到问题,Cordova 不会弄乱它...
【解决方案2】:

Rrrrrrrrr... 我发现我可以debug the iOS simulator using Safari 并且 CSP 看起来是正确的!我在 Safari 和 Chrome 中仔细检查了这一点,它们也都显示了正确的 CSP。因此,当我单击“查看源代码”时,Firefox 似乎显示出一些令人困惑的东西(我仍然无法解释这部分),但这分散了真正问题的注意力......

iOS 正在尝试使用不正确的 file:// 前缀请求远程图像文件。我认为这与 AWS URL 未指定协议这一事实有关。例如://s3-us-west-2.amazonaws.com/bla/bla/...

浏览器似乎处理得很好。但是在iOS模拟器中,似乎认为是本地文件。请注意,它有一个 file:// 前缀。

我将 API 更改为返回 https://,现在它可以在模拟器中使用。

【讨论】:

  • 是的,不要使用firefox构建Android应用程序,使用Chrome + Safari for iOS
  • @Eric 你能详细说明一下这个提示吗?我在浏览器中使用 Firefox 进行测试。 Firefox 和 Cordova 应用程序有什么特别之处吗?
  • 最好在 Safari 或 Chrome 上测试您的应用程序,因为它们是最接近 Cordova 使用的技术的浏览器。对于 iOS,Cordova 现在使用基于 Safari 引擎的 WKWebView。对于 Android,Cordova 使用 WebKit,它是 Chrome 的基础,直到 2013 年。今天,chrome 比自 1998 年以来使用 Gecko 的 Firefox 更接近 Webkit。(还有 Quantum,但我对它没有兴趣)WebKit 目前是渲染引擎Safari,因此它是对 Cordova 应用程序进行“忠实”呈现的最佳浏览器。
猜你喜欢
  • 2018-06-13
  • 1970-01-01
  • 2015-05-23
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 2011-11-08
相关资源
最近更新 更多