【发布时间】: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