javascript - postMessage a iframe de espacio aislado, ¿por qué el origen de la ventana del destinatario es nulo?

2 llamadas postMessage en la prueba: 1 usando un asterisco para targetOrigin, uno usando la misma URL https de los documentos primarios y secundarios.

botón 1:

$('.iframed')[0].contentWindow.postMessage( messageData , '*' );

botón 2:

$('.iframed')[0].contentWindow.postMessage( messageData , 'https://myurl.net' );

el elemento iframe en el documento html padre, que apunta al archivo html hijo en el mismo dominio, en el mismo directorio:

<iframe name="childFrame" class="iframed" src="child.html" sandbox="allow-scripts"></iframe>

ambos documentos están completamente cargados antes de hacer clic en los botones para activar postMessage.

==========================================

con el elemento iframe escrito como anteriormente, el botón 1 realiza el postMessage al iframe secundario y activa el oyente postMessage del niño con éxito (aunque utiliza el asterisco para targetOrigin, que preferiría no hacer). Sin embargo, el botón 2 da como resultado lo siguiente error en la consola:

"Error al ejecutar‘ postMessage ’en‘ DOMWindow ’: el origen de destino proporcionado (‘https://myurl.net") No coincide con el origen de la ventana del destinatario (" nulo ")".

==========================================

si agrego "allow-same-origin" a los parámetros del entorno limitado del iframe, ambos botones luego pasan los datos de postMessage con éxito (sin error "nulo" en la llamada del botón 2 postMessage con la URL proporcionada para el targetOrigin). No quiero hacer esto, ya que estoy usando el comportamiento de sandboxing del iframe para bloquear el contenido del iframe para que no llame a las funciones js en el documento padre. Esto es para un sistema que permite que se cargue contenido "arbitrario" (html / js / images / pdfs, aunque nada ejecutable en el servidor como php) en el iframe secundario.

tal vez sea de notar, botones similares dentro del contenido del iframe que postMessage en el documento padre funcionan bien, independientemente del parámetro allow-same-origin o la presencia del asterisco / url:

Enmarqué el botón 1:

parent.postMessage( messageData , 'https://myurl.net' ); 

botón iframed 2:

parent.postMessage( messageData , '*' ); 

==========================================

entonces, ¿por qué postMessage del padre al iframe da como resultado el error anterior si no agrego "allow-same-origin" (y por qué este problema no afecta el iframe postMessage al padre)? Intenté configurar el iframe src en una url https absoluta para el documento child.html, pero los resultados fueron los mismos. También probé el mismo código en una ubicación de servidor diferente, sin certificado SSL, y obtuve los mismos resultados (así que no piense que es https contribuyendo ...). ¿DEBO tener el asterisco como targetOrigin, Y / O usar allow-same-origin en los parámetros de sandbox?

otras conversaciones sobre este tema en SO parecen ser un callejón sin salida, por lo que esperamos obtener una nueva perspectiva sobre una solución ...

Respuestas a la pregunta(0)

Su respuesta a la pregunta