Cordova跨域文件:// iframe contentwindow通信

时间:2015-11-02 09:47:33

标签: javascript cordova iframe cross-domain

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

例如在设备上我在url文件中有一个html页面://.../index.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设备上进行了测试。

2 个答案:

答案 0 :(得分:0)

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

<access origin="*" />

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

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

答案 1 :(得分:0)

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

因此,您可以获取iFrame元素,然后发布一个像

这样的消息

otherWindow.postMessage(InfoToSend, "*");

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

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

这不会导致跨框架问题,它将是传递信息的更安全的方式,坏消息是您将无法通过window.cordova实例,因此您需要建立对话在iFramewindow.top框架之间。