2015-11-02 22 views
12

Znalazłem, że mogę wykonywać międzydomenową komunikację ze strony file:// i elementu iframe hostowanego na zdalnym hoście z właściwością contentWindow elementu iframe.Kordowa plik międzydomenowy: // iframe contentwindow komunikacja

Na przykład na urządzeniu Mam stronę html w pliku URL: //.../index.html który ładuje Cordova, a zawiera iframe:

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

Na tej stronie można wykonać JavaScript, który ładuje iframe i zapisać referencję obiektu na stronie z ramkami iframe tak:

var iframe = document.getElementById("appframe"); 
iframe.onload = function(){ 
    iframe.contentWindow.cordova = window.cordova; 
} 
iframe.src = "http://www.example.com/appframe.html"; 

teraz na stronie wewnątrz iframe, http://www.example.com/appframe.html, mogę wykonać połączenia Cordova, na przykład:

cordova.exec(null, null, "StatusBar", "hide", []); 

i to nieoczekiwanie działa, wywołując natywną warstwę wtyczki StatusBar cordova i ukrywając pasek stanu.

Moje pytanie brzmi:

Czy to jest bezpieczne w użyciu lub jest hack, który nie będzie działać w przyszłych wersjach przeglądarek?

Testowałem to na urządzeniach z systemem iOS 9 i Android 5.

+0

działa to, jeśli appframe jest obsługiwana z pliku: ///? –

+0

Interesujące. IMO jest bardzo niebezpieczne, jeśli nie masz kontroli nad zdalną stroną internetową - gdy dowiedzą się, że umieścisz kod w swojej aplikacji, mogą dostosować swój kod i "cordova.exec" wszystko, co Twoja aplikacja obsługuje za pomocą wtyczki, i być może w połączeniu z innym błędem, otrzymasz naprawdę dużą eskalację uprawnień.Powiedziawszy to, musisz jawnie wprowadzić odniesienie do 'cordova' w elemencie iframe, aby to działało, więc nie jest to luka w zabezpieczeniach, chyba że na to pozwolisz. –

+0

@mircoc Podobnie jak Ty próbuję również załadować strony HTML (rozmiar stron wynosi od 5 MB do 100 MB) w elemencie iframe, ale wielokrotnie powoduje awarię aplikacji z błędem "Brak pamięci". Czy spotkałeś się z tego typu problemem? jeśli tak, czy możesz mi doradzić, jak rozwiązać ten problem? – Deepika

Odpowiedz

0

Myślę, że prawdopodobnie masz w pliku config.xml następujący tag.

<access origin="*" /> 

jak opisano tutaj https://cordova.apache.org/docs/en/latest/guide/appdev/whitelist/ można ograniczyć przekrój politykę domeny do określonych domen wykorzystywanych jako wartość właściwości „pochodzenia”, zamiast przy użyciu symboli wieloznacznych.

Więc jeśli używasz wartości wieloznacznej, powinno to być pożądane zachowanie.

0

wierzę, że bezpieczniejszym sposobem komunikowania się między klatkami jest postMessage jak opisano w MDN, to zrobić w inny sposób może spowodować niespójność pomiędzy urządzeniami (Pamiętaj, jak rozdrobniony jest android i jak bolesne może być wsteczna kompatybilność z 4.3 i poniżej)

Tak, można uzyskać elementu iFrame, a następnie umieścić wiad jak

otherWindow.postMessage(InfoToSend, "*");

W ten sam sposób można słuchać tego wydarzenia wewnątrz ramy:

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

To będzie żadnych problemów cross-frame przyczyna i będzie to bezpieczniejszy sposób przekazywania informacji, zła wiadomość jest taka, że ​​nie będzie w stanie przejść instancję window.cordova, więc trzeba będzie ustanowić konwersacja między ramką iFrame i window.top.

+1

[Ten błąd w JIRA Cordova] (https://issues.apache.org/jira/browse/CB-4897) głosuje również za wdrożenie obsługi 'postMessage', a także przedstawia sposób zabezpieczenia komunikacji za pośrednictwem elementu iframe przez _dzielny klucz wspólny_. – Oliver