В тесте 2 вызова postMessage: 1 с использованием звездочки для targetOrigin, один с одним и тем же URL-адресом https как для родительского, так и для дочернего документов.
кнопка 1:
$('.iframed')[0].contentWindow.postMessage( messageData , '*' );
кнопка 2:
$('.iframed')[0].contentWindow.postMessage( messageData , 'https://myurl.net' );
элемент iframe в родительском html-документе, который указывает на дочерний html-файл в том же домене, в том же каталоге:
<iframe name="childFrame" class="iframed" src="child.html" sandbox="allow-scripts"></iframe>
оба документа полностью загружены, прежде чем я нажму кнопки для запуска postMessage.
==========================================
с элементом iframe, написанным, как указано выше, кнопка 1 выполняет postMessage для дочернего iframe и успешно запускает прослушиватель postMessage дочернего элемента (хотя он использует звездочку для targetOrigin, чего я бы предпочел не делать.) Однако кнопка 2 приводит к следующему ошибка в консоли:
«Не удалось выполнить 'postMessage' в 'DOMWindow': указанное целевое происхождение ('https://myurl.net') не совпадает с источником окна получателя ('null') ".
==========================================
если я добавляю «allow-same-origin» к параметрам песочницы iframe, обе кнопки затем успешно передают данные postMessage (нет ошибки «null» при вызове postMessage кнопки 2 с URL-адресом, предоставленным для targetOrigin.) однако я не Я не хочу этого делать, так как я использую поведение песочницы iframe, чтобы заблокировать содержимое iframe от вызова функций js в родительском документе. это для системы, позволяющей загружать "произвольный" контент (html / js / images / pdfs - хотя ничего исполняемого на сервере, как php) в дочерний iframe.
возможно, следует отметить, что аналогичные кнопки внутри содержимого iframe, которые отправляют сообщение в родительский документ, работают нормально, независимо от параметра allow-same-origin или наличия звездочки / URL:
Я обрамил кнопку 1:
parent.postMessage( messageData , 'https://myurl.net' );
Кнопка iframed 2:
parent.postMessage( messageData , '*' );
==========================================
Итак, почему postMessage от родительского элемента к iframe приводит к указанной выше ошибке, если я не добавляю «allow-same-origin» (и почему эта проблема не влияет на postMessage iframe для родительского элемента)? Я попытался установить для iframe src абсолютный URL-адрес https для документа child.html, но результаты были такими же. Я также протестировал тот же код на другом сервере, отличном от ssl-cert, и получил те же результаты (так что не думайте, что это способствует https ...). ДОЛЖЕН я использовать ЛИБО звездочку в качестве targetOrigin, И / ИЛИ использовать allow-same-origin в параметрах песочницы?
другие разговоры об этой проблеме на SO кажутся тупиковыми, поэтому мы надеемся получить новый взгляд на решение ...