2015-11-02 97 views
12

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

例如在设备上我的网址文件的HTML页面://.../index.html加载科尔多瓦,并包含一个iframe:

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

在这个页面上,我可以执行加载的iframe和保存对象中的iFrame网页这样一个参考的javascript:

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.exec(null, null, "StatusBar", "hide", []); 

这意外的工作,调用StatusBar科尔多瓦插件的本地层和隐藏状态栏。

我的问题是:

这是安全使用或不会在浏览器的未来版本中运行的黑客?

我在iOS 9和Android 5设备上测试过它。

+0

如果appframe是从file:///提供的,则可以执行此项工作。 –

+0

有趣。海事组织是非常不安全的,如果你不控制远程网站 - 当他们知道你将代码嵌入你的应用程序时,他们可以通过插件调整他们的代码和'cordova.exec'你的应用程序支持的任何东西,并可能与其他一些错误相结合,实现特权升级。话虽如此,你需要明确地将对cordova的引用注入到iframe中才能工作,所以它不是一个安全漏洞,除非你愿意。 –

+0

@mircoc像你一样我也试图在iframe中加载html页面(页面大小从5Mb到100Mb),但是很多次应用程序崩溃时出现“内存不足”错误。你遇到过这种问题吗?如果是的话,你能指导我如何解决这个问题吗? – Deepika

回答

0

我想可能你的config.xml中有下面的标签。

<access origin="*" /> 

这里 https://cordova.apache.org/docs/en/latest/guide/appdev/whitelist/描述,你可以限制跨域策略来作为财产“起源”,而不是使用通配符的值指定的域。

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

0

相信帧之间进行通信的安全的方法是postMessageMDN所描述的,这样做以不同的方式可能会导致装置之间的不一致性(记住如何零散是机器人和如何痛苦可以是具有4.3和下面的向后兼容性)

所以,你可以得到的IFRAME元素,然后张贴像

otherWindow.postMessage(InfoToSend, "*");

一个味精,你可以听框内该事件以同样的方式:

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

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

+1

[Cordova的JIRA中的这个bug](https://issues.apache.org/jira/browse/CB-4897)也投票支持'postMessage',并且提供了一种通过iframe保证通信的方法通过_secret共享key_。 – Oliver