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

Javascript Cordova跨域文件://iframe contentwindow通信,javascript,cordova,iframe,cross-domain,Javascript,Cordova,Iframe,Cross Domain,我发现我可以从文件://上的页面和承载在远程主机上且具有iframe的contentWindow属性的iframe进行跨域通信 例如,在设备上,我在url处有一个html页面file://.../index.html 加载cordova并包含iframe的: <script type="text/javascript" src="cordova.js"></script> <iframe id="appframe"></iframe> 现在在if

我发现我可以从
文件://
上的页面和承载在远程主机上且具有iframe的contentWindow属性的iframe进行跨域通信

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

<script type="text/javascript" src="cordova.js"></script>
<iframe id="appframe"></iframe>
现在在iframe内的页面上,我可以执行cordova调用,例如:

cordova.exec(null, null, "StatusBar", "hide", []);
这出人意料地起作用,调用StatusBar cordova插件的本机层并隐藏StatusBar

我的问题是:

这是一种安全的使用方法,还是一种在未来版本的浏览器中不起作用的黑客方法?


我在iOS 9和安卓5设备上进行了测试。

我想您的config.xml中可能有以下标记

<access origin="*" />
您可以将跨域策略限制为用作属性“origin”值的指定域,而不是使用通配符


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

我认为帧间通信的更安全方式是
postMessage
,如中所述,以不同的方式进行通信可能会导致设备之间不一致(还记得安卓系统有多支离破碎,以及向后兼容4.3及以下版本会有多痛苦吗)

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

otherWindow.postMessage(InfoToSend,“*”);

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

window.addEventListener(“message”,receiveMessage,false);


这不会导致跨帧问题,而且这是传递信息的更安全的方式,坏消息是您将无法传递
窗口。cordova
实例,因此您需要在
iFrame
窗口之间建立对话。top
框架。

如果appframe由f提供服务,这是否有效ile://?有趣。在我看来,这样做是非常不安全的,如果你不控制远程网站-当他们知道你在你的应用程序中嵌入了他们的代码时,他们可以通过插件调整他们的代码和
cordova.exec
你的应用程序支持的任何东西,也许再加上一些其他的bug,会得到非常大的权限提升也就是说,您需要将对
cordova
的引用显式地注入iframe中,这样才能起作用,因此除非您允许,否则这不是一个安全漏洞。@mircoc和您一样,我也在尝试加载html页面(页面大小从5Mb到100Mb)在iframe中,但多次应用程序因错误“内存不足”而崩溃。您是否遇到过此类问题?如果是,您能否指导我如何解决此问题?投票支持实现对
postMessage
,并提供了一种通过秘密共享密钥通过iframe保护通信的方法。
<access origin="*" />