Связь между двумя детьми iframe с использованием postMessage

У меня есть код для встраивания, который пользователи могут размещать на своих сайтах. Он создает два дочерних iframes на странице. Я хотел бы, чтобы эти дети могли общаться.

Я использую javascript window.postMessage https://developer.mozilla.org/en-US/docs/DOM/window.postMessage

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

Когда все три (родительский и двое детей) находятся в одном домене, это довольно просто, и я работаю с проверкой безопасности, проверяя, что e.origin - это мой собственный сайт

# coffeescript
# host = "http://www.mysite.com"
host = "http://localhost"

receive_message = (e) ->
  console.log("received message from " + e.origin + ": " + e.data)
  return if e.origin != host

  if e.data == "show"
    ...
  else if e.data == "hide"
    ...

window.addEventListener("message", receive_message, false)

Что такое элегантный способ проверить происхождение, когда родитель может находиться в любом домене?

Что такое хороший способ разрешить отладку script, где источник может быть localhost?

Достаточно ли просто проверить параметр данных, если передаются неразрушающие/изменяющиеся сообщения?

Спасибо!

Ответ 1

Почему вы говорите, что дочерние iframe не могут напрямую общаться? Собственно, они могут. Что вы можете сделать в дочернем iframe, используется свойство window.parent, чтобы получить ссылку на родительское окно, а затем использовать родительское свойство frames для получения ссылок на все дочерние iframes (свойство frames дает вам массив таких ссылок). После этого вы можете использовать postMessage для каждой из этих ссылок и установить требуемое ограничение места в вызове postMessage, чтобы убедиться, что только правильный iframe получает сообщение.

Обратите внимание, что это будет работать, даже если все три окна (iframe1, родительское окно и iframe2) находятся в разных доменах, потому что iframe1 ничего не делает с родительским окном (которое нарушает SOP), оно только извлекает ссылки на вложенные iframes.

Ссылки:

https://developer.mozilla.org/en-US/docs/DOM/window.parent

https://developer.mozilla.org/en-US/docs/DOM/window.frames