html5 javascript- ¿Cómo atrapar bash de iniciar navigation fuera de sandboxed iframe?

Tengo un iframe de espacio aislado que no permite cambiar la location:

<iframe sandbox="allow-forms allow-popups allow-pointer-lock allow-same-origin allow-scripts" class="iframe visible" src="thesource.html" width="100%" scrolling="auto" frameborder="0"></iframe> 

Si el iframe intenta desttwigrse o cambiar de location, veo una página en blanco porque el browser detiene la operación del iframe. Este es el logging de Chrome:

JavaScript inseguro intenta iniciar la navigation para el marco con la URL ' http://example.com ' desde el marco con la URL ' http://otherdomaian.com '. El marco que intenta navegar por la window de nivel superior está en espacio aislado, pero el indicador 'permitir-top-navigation' no está configurado.

Eso es genial, pero quiero ver esto, así que si sucede pasaré al siguiente iframe. Entonces, ¿cómo atrapo este bash?

EDITAR:

Agregué un código jsfiddle (verifique el error en el logging de la console)

También intenté escuchar un evento sin éxito:

 document.addEventListener('error', receiveMessage, true); function receiveMessage(error) { alert("iframe tried to unframe itself"); } 

2 Solutions collect form web for “html5 javascript- ¿Cómo atrapar bash de iniciar navigation fuera de sandboxed iframe?”

Soy nuevo aquí, así que no tengo la reputación suficiente para comentar las respuestas y me disculpo si estoy haciendo esto mal, pero desafortunadamente la solución aceptada no podrá lograr lo que estás buscando.

Pude demostrar lo que quiero decir con la ejecución del script de JSFiddle una vez que el DOM está listo (no habrá ninguna alerta pero aún habrá un error en la console). Aquí hay un poco más de detalle sobre lo que sucede actualmente con ese violín:

 // running with the No wrap - in <head> option var frame = document.querySelector('iframe'); // null, the iframe isn't there yet try { frame.src="http://wedesignthemes.com/themes/networkingirect.php?theme=wedding"; } catch(e) { // TypeError here, no hints about the iframe :( alert('Error!'); } 

La exception que se está capturando no tiene nada que ver con el iframe, en realidad es un error de tipo al tratar de establecer la propiedad src en un valor null .

Lo que realmente desea hacer es detectar el error dentro del iframe (cuando el script de espacio aislado intenta acceder a window.top ), pero esto no es posible debido a la política Same-origin . Por cierto, establecer el indicador de recinto de security "allow-same-origin" solo tiene un efecto cuando el contenido del iframe se sirve desde el mismo origin que el documento de nivel superior. Por ejemplo, tan pronto como el src o la location del iframe cambie a un origin diferente, no hay forma de tocar nada dentro .

Hay forms de comunicarse a través de los límites del iframe , como window.postMessage o la forma más antigua y trucada de usar la location.hash del iframe.hash, pero asumo que no puede afectar la fuente de la página que va a su iframe. (Un buen desarrollador, por supuesto, estaría abierto a sugerencias y vería que una característica como esta podría ser útil).

La única forma en que pude detectar este error sin violar ninguna política de security del browser fue establecer el indicador de sandbox allow-top-navigation y luego usar el controller window.onbeforeunload en el documento de nivel superior para detectar el bash de navigation del iframe hijo. . Nunca recomendaría esto porque la experiencia del usuario es horrible . No hay forma de evitar la navigation sin preguntar al usuario si desean abandonar la página o no. Prueba de concepto a continuación:

 <iframe id="myframe" sandbox="allow-scripts allow-top-navigation"></iframe> <script> var url = "http://wedesignthemes.com/themes/networkingirect.php?theme=wedding", frame = document.getElementById("myframe"), listener; listener = window.addEventListener("beforeunload", function(e) { e.preventDefault(); e.stopImmediatePropagation(); // The iframe tried to bust out! window.removeEventListener("beforeunload", listener); return "This is unavoidable, you cannot shortcut a " + "navigation attempt without prompting the user"; }); frame.src = url; </script> 

Desafortunadamente, no puedo encontrar ninguna manera de hacerlo bien en las implementaciones de browser actuales sin la ayuda de su desarrollador de contenido de terceros. Leí algunas cosas interesantes en la especificación de HTML5 que podrían permitirnos hacer cosas como esta en el futuro (y desafortunadamente estoy al límite de mi número de enlaces que puedo insert aquí), así que me mantendría atento a medida que avancen las cosas.

Ejemplo:

Un con restricciones adicionales:

 <iframe src="demo_iframe_sandbox.htm" sandbox=""></iframe> 

el atributo sandbox es compatible con Internet Explorer 10, Firefox, Chrome y Safari.

Nota: El atributo sandbox no es compatible con Internet Explorer 9 y versiones anteriores, ni con Opera.

Definición y uso

Si se especifica como una cadena vacía (sandbox = ""), el atributo de recinto de security habilita un set de restricciones adicionales para el contenido en el marco en línea.

El valor del atributo de recinto de security puede ser una cadena vacía (se aplican todas las restricciones) o una list de valores pnetworkingefinidos separados por espacios que ELIMINARÁ restricciones particulares.

Diferencias entre HTML 4.01 y HTML5

El atributo de sandbox es nuevo en HTML5.

Sintaxis

 <iframe sandbox="value"> 

Valores de atributo

  1. "" => Aplica todas las restricciones a continuación
  2. allow-same-origin => Permite que el contenido del iframe sea tratado como del mismo origen que el documento que lo contiene
  3. allow-top-navigation => Permite que el contenido del iframe navegue (cargue) el contenido desde el documento que lo contiene
  4. allow-forms => Permite el envío de formularios
  5. allow-scripts => Permite la ejecución de scripts

javascript: es un tipo de protocolo URI extraño. Funciona en algunos contexts, como, pero no en todos, por ejemplo, la location de una window no se puede establecer en dicho URI. (Si bien puede asignar un javascript: URI a window.location como una forma indirecta de ejecutar un script, la location de la window no permanece establecida en ese valor).

Para escribir contenido en un IFRAME, obtenga una reference al documento del marco y escriba en él. Hacerlo requerirá que establezca el indicador de espacio aislado de permitir el mismo origen.

 <iframe id="myframe" sandbox="allow-scripts allow-same-origin" src="about:blank"></iframe> 

 <script> var frame = document.getElementById("myframe"); var fdoc = frame.contentDocument; fdoc.write("Hello world"); // or whatever </script> 

Ejemplo en vivo: http://jsfiddle.net/wUvrF/1/

  • Cómo "bloquear" V8?
  • Cómo bloquear (o sandbox) el intérprete de Javascript incorporado de JDK para ejecutar scripts que no son de confianza
  • Embedded node / javascript sandbox?
  • Depuración del module gf3 / sandbox
  • ¿Cómo puedo proteger el contenido de JavaScript enviado por el usuario no confiable?
  • ¿Es posible ejecutar código python nativo en Chrome?
  • Detectar compatibilidad con el atributo sandbox iframe de HTML5
  • Se bloqueó la ejecución de scripts porque el marco del documento es un espacio aislado - Aplicación angular
  • Lenguaje adecuado para ejecutar código de cliente en sandbox
  • Iframe sandboxing con error de bandera 'permitir el mismo origen'
  • Hacer sandbox alnetworkingedor de Function () en Javascript
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.