Можно ли отправить сообщение postMessage в iframe в песочнице БЕЗ флага allow-scripts?

В основном у меня есть междоменный iframe, и я не могу включить флаг allow-scripts, но в то же время мне нужно получить postMessage, который находится в теге <script> в документе iframe, ИЛИ получить доступ к iframe contentDocument.

Я пробовал:

let iframeElement = document.getElementsByTagName('iframe')[0];
let iframeContent = iframeElement.contentDocument
console.log(iframeContent)

Но с флагом песочницы я получаю только null возврат.

Что мне нужно сделать, так это один из трех вариантов:

  • Добавьте eventListener в тег, который вставляет iframe contentDocument
  • Получите значение attr, которое также находится внутри iframe contentDocument
  • Способ отправить JSON со страницы происхождения и получить этот JSON на странице с iframe (postMessage)

Но все это без флага allow-scripts, возможно ли вообще то, что я пытаюсь архивировать?


person 4rtik    schedule 05.12.2018    source источник
comment
Вы не можете напрямую взаимодействовать с перекрестным источником <iframe>. Если <iframe> не имеет allow-scripts, он не может отправить postMessage() или запустить какой-либо другой код.   -  person SLaks    schedule 06.12.2018
comment
Разве что-то вроде флага allow-post-message нет?   -  person 4rtik    schedule 06.12.2018
comment
postMessage() - это функция JavaScript. Если вы не разрешаете JavaScript, вы не можете запускать любой JavaScript.   -  person SLaks    schedule 06.12.2018
comment
Да, я подумал, спасибо за вашу помощь.   -  person 4rtik    schedule 06.12.2018
comment
В таких ситуациях обычно разумно объяснить, чего вы пытаетесь достичь. Могут быть другие решения для получения того же результата, но мы не сможем дать вам их, если не знаем, что вы собираетесь делать.   -  person icecub    schedule 06.12.2018
comment
Не комментируйте эту информацию. Вместо этого отредактируйте свой вопрос, чтобы он был понятен всем, кто пытается вам помочь.   -  person icecub    schedule 06.12.2018
comment
сделано, спасибо за помощь   -  person 4rtik    schedule 06.12.2018
comment
Это совершенно невозможно.   -  person SLaks    schedule 06.12.2018
comment
Это именно то, что я сказал своему клиенту, но ради этого я решил спросить, большое спасибо вам, ребята, за помощь.   -  person 4rtik    schedule 06.12.2018
comment
@SLaks Я тоже так думаю. Хотя ответ здесь заставил меня задуматься ... Вероятно, в этом случае он не сработает , а может быть, можно посмотреть?   -  person icecub    schedule 06.12.2018


Ответы (2)


Простой ответ - нет.

‹Iframe> с атрибутом sandbox, ограничивающим использование скриптов, не может выполнять скрипты. Таким образом, вы не сможете вызвать postMessage() из этого контекста iframe, а также не сможете выполнить обратный вызов для прослушивателя событий.

Теперь, поскольку ваш документ не удовлетворяет политикам перекрестного происхождения, вы застряли, не имея возможности взаимодействовать с документом ‹iframe> извне.


Единственный обходной путь, если эта функция является обязательной, - это использовать ваш сервер в качестве прокси, чтобы содержимое вашего iframe фактически извлекалось и обслуживалось вашим собственным сервером.

Таким образом, больше нет проблем с перекрестным происхождением (если вы добавите политику allow-same-origin в свой iframe), и вы сможете получить доступ к своему содержимому iframe из родительского документа или даже добавить прослушиватели событий, даже если по-прежнему никакие скрипты не могут запускаться из this ‹iframe>, все будет запускаться из контекста основного документа. (Это означает, что по-прежнему нет postMessage() из ‹iframe>).

person Kaiido    schedule 06.12.2018

Процитирую часть вашего вопроса:

Мне нужно получить сообщение postMessage, которое находится в теге <script> в документе iframe

Если вы имеете в виду, что вам нужно поместить или вставить тег <script>, содержащий postMessaging, то я боюсь, что это невозможно, потому что политика одинакового происхождения предотвратит это.

Однако если вы пытаетесь получить доступ или прослушать postMessage транслируется из тега <script> внутри iframe с перекрестным происхождением, тогда да, именно для этого был разработан postMessage. При условии, что прослушиватель событий вашего сообщения размещен в источнике, как определено в аргументе targetOrigin postMessage.

PostMessage - это, по сути, договор о доверии для преодоления барьеров, связанных с разными источниками; либо имея ...

  • доступ и разрешение на создание содержимого iframe
  • было поручено прослушивать транслируемые сообщения посредством размещения на targetOrigin определенном (рекомендованном) или на любом источнике, если targetOrigin имеет значение подстановочного знака '*' ( не рекомендуется)

https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#Security_concerns

person Wayne    schedule 06.12.2018
comment
Да, я просто пытаюсь прослушать трансляцию postMessage из тега ‹script› внутри iframe с перекрестным происхождением, но чувствую, что iframe имеет sandbox="allow-same-origin allow-forms" attr, тег скрипта с кодом postMessage не выполняется, поэтому слушатель не выполняет я ничего не получаю от postMessage, и из-за политики безопасности я не могу использовать флаг allow-script - person 4rtik; 06.12.2018