2015-11-02 95 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