2015-11-02 15 views
12

Ho scoperto che posso eseguire comunicazioni tra domini da una pagina su file:// e un iframe ospitato su un host remoto con la proprietà contentWindow dell'iframe.File cross-domain Cordova: // iframe contentwindow communication

Per esempio sul dispositivo Ho una pagina html il file url: //.../index.html che carica Cordova e contiene un iframe:

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

In questa pagina posso eseguire un javascript che carica l'iframe e salvare un riferimento di un oggetto nella pagina iframed in questo modo:

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

Ora sulla pagina all'interno del iframe, http://www.example.com/appframe.html, posso eseguire una chiamata di Cordova, per esempio:

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

e funziona in modo imprevisto, chiamando il livello nativo del plugin cordova StatusBar e nascondendo la barra di stato.

La mia domanda è:

È questo sicuro da usare o è un trucco che non funziona nella versione futura dei browser?

L'ho provato su dispositivi iOS 9 e Android 5.

+0

funziona se l'appframe viene servito dal file: ///? –

+0

Interessante. IMO è molto pericoloso farlo, se non controlli il sito remoto - quando apprendono che hai incorporato il loro codice nella tua app, possono aggiustare il loro codice e 'cordova.exec' tutto ciò che la tua app supporta tramite un plugin, e forse in combinazione con qualche altro bug, ottieni un'escalation di privilegi davvero grande.Detto questo, è necessario iniettare esplicitamente il riferimento a 'cordova' nell'iframe per farlo funzionare, quindi non è un buco di sicurezza a meno che non lo si lasci. –

+0

@mircoc Come te, sto anche provando a caricare pagine html (la dimensione delle pagine va da 5 Mb a 100 Mb) in iframe ma molte volte l'app si blocca con errore "Memoria insufficiente". Hai affrontato questo tipo di problema? se sì, puoi guidarmi come risolvere questo? – Deepika

risposta

0

Penso che probabilmente hai nel tuo config.xml il seguente tag.

<access origin="*" /> 

come qui https://cordova.apache.org/docs/en/latest/guide/appdev/whitelist/ descritto si potrebbe restringere il criterio di dominio trasversale ai domini intermedi utilizzati come valore della proprietà "origine" invece di utilizzare un carattere jolly.

Quindi, se si utilizza il valore jolly, questo dovrebbe essere il comportamento desiderato.

0

Credo che il modo più sicuro per comunicare tra frame è postMessage come descritto in MDN, fanno in modo diverso potrebbe causare incoerenza tra dispositivi (Ricordate come frammentato è android e quanto doloroso potrebbe essere la compatibilità con 4.3 e sotto)

quindi, si potrebbe ottenere l'elemento iFRAME e quindi inviare un msg come

otherWindow.postMessage(InfoToSend, "*");

Allo stesso modo si poteva ascoltare questo evento all'interno del telaio:

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

Questo sarà nessun problema di cross-telaio di causa sarà il modo più sicuro per passare informazioni, la cattiva notizia è che non sarà in grado di passare l'istanza window.cordova, quindi sarà necessario stabilire un conversazione tra il iFrame e il frame window.top.

+1

[Questo bug in JIRA di Cordova] (https://issues.apache.org/jira/browse/CB-4897) vota per implementare il supporto per 'postMessage', e presenta anche un modo per proteggere la comunicazione tramite l'iframe tramite una _secret chiave condivisa_. – Oliver

Problemi correlati