2015-11-02 2 views
12

Я обнаружил, что могу выполнять междоменную связь со страницы на file:// и iframe, размещенную на удаленном хосте с свойством contentWindow iframe.Кордоба междоменного файла: // iframe contentwindow communication

Например, на устройстве у меня есть HTML-страницу в файл URL: //.../index.html, который загружает Кордову и содержит IFRAME:

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

На этой странице можно выполнить Javascript, что загружает IFRAME и сохранить ссылку на объект в фреймах страницы, как это:

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

Теперь на странице внутри фрейма, http://www.example.com/appframe.html, я могу выполнить Cordova вызов, например:

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

, и это неожиданно работает, вызывая собственный слой плагина StatusBar cordova и скрывая строку состояния.

Мой вопрос:

Это безопасно для использования или является Хак, который не будет работать в будущих версиях браузеров?

Я тестировал его на устройствах iOS 9 и Android 5.

+0

делает это, если appframe обслуживается из файла: ///? –

+0

Интересно. IMO это очень небезопасно, если вы не контролируете удаленный веб-сайт - когда они узнают, что вы вставляете свой код в свое приложение, они могут настроить свой код и 'cordova.exec' все, что поддерживает ваше приложение через плагин, и, возможно, с объединением с какой-то другой ошибкой, получите очень большую эскалацию привилегий.Сказав это, вам нужно явно ввести ссылку на «кордову» в iframe, чтобы это работало, поэтому это не дыра в безопасности, если вы не позволите. –

+0

@mircoc Как и я, я также пытаюсь загрузить html-страницы (размер страниц от 5Mb до 100Mb) в iframe, но во много раз сбой приложений с ошибкой «Out of memory». Вы столкнулись с этим типом проблемы? если да, можете ли вы посоветовать мне, как это решить? – Deepika

ответ

0

Я думаю, что, вероятно, у вас в вашем config.xml следующий тег.

<access origin="*" /> 

, как описано здесь https://cordova.apache.org/docs/en/latest/guide/appdev/whitelist/ можно ограничить перекрестную политику домена для указанных доменов, используемых в качестве значения свойства «происхождение» вместо того, чтобы использовать подстановочные знаки.

Поэтому, если вы используете значение подстановочного знака, это должно быть желаемое поведение.

0

Я считаю, что безопасный способ обмена данными между кадрами составляет postMessage, как описано в MDN, сделать это по-другому может вызвать несоответствие между устройствами (Помните, как фрагментарный является андроид и как больно может быть обратная совместимость с 4.3 и ниже)

Таким образом, вы можете получить элемент IFrame, а затем опубликовать Сообщ как

otherWindow.postMessage(InfoToSend, "*");

Точно так же вы можете слушать это событие внутри рамы:

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

Это будет нет проблем кросса-каркасной причины, и это будет более безопасным способом передачи информации, плохая новость заключается в том, что вы не будете в состоянии передать экземпляр window.cordova, так что вам нужно будет учредить разговор между iFrame и фреймом window.top.

+1

[Эта ошибка в JORA Кордовы] (https://issues.apache.org/jira/browse/CB-4897) голоса для поддержки поддержки postMessage также, а также представляет способ обеспечения безопасности через iframe через общий ключ _secret. – Oliver

Смежные вопросы