Кордовы междоменного файла://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.
Ответы
Ответ 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
.