【问题标题】:Cordova: CSP issue on Android when requesting data over HTTPSCordova:通过 HTTPS 请求数据时 Android 上的 CSP 问题
【发布时间】:2015-12-07 22:50:08
【问题描述】:

Cordova Android 是一个 Android 应用程序库,它允许 为 Android 平台构建的基于 Cordova 的项目。科尔多瓦 基于应用程序的核心是使用 Web 编写的应用程序 技术:HTML、CSS 和 JavaScript。 Apache Cordova 是一个项目 Apache 软件基金会 (ASF)。

我使用 Cordova 开发了一个应用程序,它可以在 iOS 上按预期运行,当签名的应用程序从 Android Studio 直接部署到三星 S6 时,它可以在 Android 上运行。

但是,当从 Google Play 下载应用程序时,它不会从 HTTPS 请求中获取请求的数据。

这里是config.xml中的白名单设置:

<plugin name="cordova-plugin-whitelist" version="1" />
<access origin="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<platform name="android">
    <allow-intent href="market:*" />
</platform>
<platform name="ios">
    <allow-intent href="itms:*" />
    <allow-intent href="itms-apps:*" />
</platform>

以及index.html中的CSP设置

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

这是未获取数据的请求(没有任何有意义的错误消息 - e.type 只是一个空字符串)

_routingControl = L.Routing.control({
                                        plan: L.Routing.plan([
                                            L.latLng(coords),
                                            L.latLng(_userMarker.getLatLng())
                                        ],{
                                            createMarker: function() {return false}
                                        }),
                                        fitSelectedRoutes: true,
                                        autoRoute: true,
                                        show: false,
                                        serviceUrl: 'https://router.project-osrm.org/viaroute'
                                     });

由于这适用于 iOS,我认为白名单/CSP 设置存在问题。

有人可以解释为什么从应用商店下载应用时这不起作用吗?

【问题讨论】:

  • 您应该能够使用 Chrome 远程调试器的 JavaScript 控制台获得更详细的错误消息,CSP 错误往往非常详细,因此我建议您在远程调试器上运行应用程序并查看发生在 JS 控制台中。这可能会阐明问题所在,因此我们可以提出修复建议。 developer.chrome.com/devtools/docs/remote-debugging
  • @SimonPrickett 我确实使用 Chrome 远程调试器。正如我所说,签名的应用程序在通过 USB 从 Android Studio 部署到设备时有效,但从应用商店下载时无效。
  • 你想要修复还是解释?
  • 当应用从 Android Studio 部署时可以工作,但从 Play 商店下载时不能工作,这通常是服务器证书问题,当应用在 Play 商店时它具有 debugable 标志设置为 false 并且不允许某些它认为不安全的证书(证书本身或您用来签署它的根证书)
  • @JesseMonroy650 如果您有解决办法,请告诉我。

标签: android cordova cordova-plugins cordova-3 osrm


【解决方案1】:

@巴布, 只需一秒钟即可解决问题。

让我感到困惑的一件事是开发人员从“开发 IDE”转向Google Play。作为使用 Phonegap Build 构建的人,我的工作流程不包括电缆和“adb”。或许你可以解释一下这个过程的原因。

在您的问题上,您需要实施白名单系统。 此工作表应该会有所帮助。
HOW TO apply the Cordova/Phonegap the whitelist system

还有从那里链接到Whitelist CSP Examples 的文档。简而言之,它通常的应用方式是从 webbrowser 扩展 CSP,然后将元元素添加到 App 中。但是,在您的情况下,您可能会倒退。

修复

通常,当我给出答案时,我会给出白名单CSP。您也许可以只从 CSP 开始。祝你好运。

将此添加到您的config.xml

<allow-navigation href="*" />
<allow-intent href="*" />
<access origin="*" /> <!-- Required for iOS9 -->

请注意,您的应用现在不安全。保护您的应用程序由您决定。
将以下内容添加到您的 index.html

<meta http-equiv="Content-Security-Policy" 
         content="default-src *; 
                  style-src * 'self' 'unsafe-inline' 'unsafe-eval'; 
                  script-src * 'self' 'unsafe-inline' 'unsafe-eval';">

旁注: gap: 就我现在所拥有的而言,仅 Cordova iOS 需要,请参阅:Simon Mac Donald Adds

【讨论】:

    猜你喜欢
    • 2018-06-11
    • 2017-06-11
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 2013-10-22
    • 2021-03-20
    • 2010-11-05
    • 2016-06-27
    相关资源
    最近更新 更多