Подтвердить что ты не робот

Кордовы междоменного файла://iframe contentwindow communication

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

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

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

На этой странице я могу выполнить javascript, который загружает iframe и сохраняет ссылку на объект на 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.

4b9b3361

Ответ 1

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

<access origin="*" />

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

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

Ответ 2

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

Итак, вы можете получить элемент iFrame, а затем отправить сообщение с сообщением

otherWindow.postMessage(InfoToSend, "*");

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

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

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