【问题标题】:Cordova cross-domain file:// iframe contentwindow communicationCordova 跨域 file:// iframe contentwindow 通信
【发布时间】:2016-02-02 04:01:54
【问题描述】:

我发现我可以从file:// 上的页面和托管在远程主机上的 iframe 进行跨域通信,并使用 iframe 的 contentWindow 属性。

例如,在设备上,我在 url file://.../index.html 有一个 html 页面,它加载了cordova并包含一个 iframe:

<script type="text/javascript" src="cordova.js"></script>
<iframe id="appframe"></iframe>

在此页面上,我可以执行加载 iframe 的 javascript,并在 iframed 页面中保存对象的引用,如下所示:

var iframe = document.getElementById("appframe");
iframe.onload = function(){
    iframe.contentWindow.cordova = window.cordova;
}
iframe.src = "http://www.example.com/appframe.html";

现在在 iframe 内的页面http://www.example.com/appframe.html 上,我可以执行cordova 调用,例如:

cordova.exec(null, null, "StatusBar", "hide", []);

这出乎意料地起作用了,调用了 StatusBar cordova 插件的本机层并隐藏了状态栏。

我的问题是:

这是安全使用还是在未来版本的浏览器中无法使用的破解?

我在 iOS 9 和 Android 5 设备上对其进行了测试。

【问题讨论】:

  • 如果 appframe 是从 file:/// 提供的,这是否有效?
  • 有趣。 IMO 这样做是非常不安全的,如果您不控制远程网站 - 当他们得知您将他们的代码嵌入您的应用程序时,他们可以调整他们的代码和 cordova.exec 您的应用程序通过插件支持的任何内容,也许结合其他一些错误,获得非常大的特权升级。话虽如此,您需要将cordova 的引用显式注入到 iframe 中才能正常工作,因此除非您允许,否则它不是安全漏洞。
  • @mircoc 和你一样,我也尝试在 iframe 中加载 html 页面(页面大小从 5Mb 到 100Mb),但很多时候应用程序因错误“内存不足”而崩溃。你遇到过这类问题吗?如果是,你能指导我如何解决这个问题吗?

标签: javascript cordova iframe cross-domain


【解决方案1】:

我相信在框架之间进行通信的更安全的方式是 postMessage,如 MDN 中所述,以不同的方式进行可能会导致设备之间的不一致(请记住,android 是多么的碎片化,向后兼容可能是多么痛苦4.3及以下)

因此,您可以获取 iFrame 元素,然后发布类似的消息

otherWindow.postMessage(InfoToSend, "*");

以同样的方式,您可以在框架内收听该事件:

window.addEventListener("message", receiveMessage, false);

这不会导致跨框架问题,并且会是更安全的信息传递方式,坏消息是您将无法传递window.cordova 实例,因此您需要在iFramewindow.top 框架。

【讨论】:

  • This bug in Cordova's JIRA 也投票支持postMessage,并提供了一种通过秘密共享密钥通过 iframe 保护通信的方法。
【解决方案2】:

我认为您的 config.xml 中可能有以下标记。

<access origin="*" />

如此处所述 https://cordova.apache.org/docs/en/latest/guide/appdev/whitelist/ 您可以将跨域策略限制为用作属性“origin”值的指定域,而不是使用通配符。

因此,如果您使用通配符值,这应该是所需的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    相关资源
    最近更新 更多