2008-12-15 21 views
107

Algunos sitios web tienen código para "salir" de IFRAME recintos, lo que significa que si una página A se carga como un IFRAME dentro de una página padre P algunos Javascript en A redirige la ventana externa a A.Cómo prevenir IFRAME redirija ventana de nivel superior

Normalmente esto Javascript se ve algo como esto:

<script type="text/javascript"> 
    if (top.location.href != self.location.href) 
    top.location.href = self.location.href; 
</script> 

Mi pregunta es: Como el autor de la página principal P y no ser el autor de la página interior A, ¿cómo puedo evitar que A de hacer esto ¿fugarse?

P.S. Me parece que debería ser una violación de seguridad entre sitios, pero no lo es.

+0

No creo que pueda hacer mucho ... si no es el autor del contenido del marco. – scunliffe

Respuesta

35

Intente utilizar la propiedad onbeforeunload, que le permitirá al usuario elegir si desea navegar fuera de la página.

Ejemplo: https://developer.mozilla.org/en-US/docs/Web/API/Window.onbeforeunload

En HTML5 puede utilizar la propiedad caja de arena. Por favor, vea la respuesta de Pankrat a continuación. http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/

+1

iFrames * do * permite la comunicación entre dominios, sin embargo, usando 'postMessage'. Esto no es un riesgo de seguridad, pero a alguien le puede importar saber que esta capacidad existe cuando vean su comentario. :) – coreyward

+0

No fue posible en el momento de escribir esta respuesta. Gracias por señalarlo. –

+16

Un ejemplo de código hubiera sido bueno. – fbmd

0

Al hacerlo, podría controlar cualquier acción de la página enmarcada, lo cual no es posible. Same-domain origin policy aplica.

+14

No estoy pidiendo que controle qué hay dentro de IFRAME. Estoy pidiendo * prevenir * que lo que está dentro del IFRAME me controle. –

2

Desde la página se carga dentro del marco flotante puede ejecutar el código "romper" con un setInterval, onbeforeunload no podría ser que práctico, ya que podría Flud al usuario '¿Seguro que quieres salir?' diálogos.

También existe el atributo de seguridad iframe que sólo funciona en IE & Opera

:(

2

En mi caso quiero que el usuario visita la página interior de manera que el servidor va a ver a su IP como visitante Si utilizo la técnica de proxy de php, creo que la página interna verá mi servidor ip como visitante, por lo que no es buena. La única solución que obtuve hasta ahora es wilth onforeforeload. Pon esto en tu página:

<script type="text/javascript"> 
    window.onbeforeunload = function() {      
     return "This will end your session"; 
    } 
</script> 

Esto funciona tanto en Firefox como en es decir, eso es lo que probé. encontrará versiones que usan algo como evt.return (lo que sea) basura ... eso no funciona en Firefox.

109

Con HTML5 se añadió el atributo iframe sandbox. En el momento de escribir este works on Chrome, Safari, Firefox and recent versions of IE and Opera pero lo hace más o menos lo que quiere:

<iframe src="url" sandbox="allow-forms allow-scripts"></iframe> 

Si desea permitir de nivel superior redirige especificar sandbox="allow-top-navigation".

+0

espera ... ¿qué? Ellos te dejan hacer esto? Pensé que si un sitio web quería estallar, todos los navegadores lo dejarían. ¿Cómo se supone que las personas mantienen su sitio web fuera de iframes con esto? No me quejo, impresionante. –

+2

Aquí está el antídoto: http://blogs.msdn.com/b/ieinternals/archive/2010/03/30/combating-clickjacking-with-x-frame-options.aspx – Pankrat

+0

Además, el navegador podría/respetará el encabezado de la solicitud src iframe: X-Frame-Options: SAMEORIGIN –

4

Sé que ha pasado mucho tiempo desde que se realizó la pregunta, pero esta es mi versión mejorada que esperará 500ms para cualquier llamada posterior solo cuando se cargue el iframe.

<script type="text/javasript"> 
var prevent_bust = false ; 
    var from_loading_204 = false; 
    var frame_loading = false; 
    var prevent_bust_timer = 0; 
    var primer = true; 
    window.onbeforeunload = function(event) { 
     prevent_bust = !from_loading_204 && frame_loading; 
     if(from_loading_204)from_loading_204 = false; 
     if(prevent_bust){ 
      prevent_bust_timer=500; 
     } 
    } 
    function frameLoad(){ 
     if(!primer){ 
      from_loading_204 = true; 
      window.top.location = '/?204'; 
      prevent_bust = false; 
      frame_loading = true; 
      prevent_bust_timer=1000; 
     }else{ 
      primer = false; 
     } 
    } 
    setInterval(function() { 
     if (prevent_bust_timer>0) { 
      if(prevent_bust){ 
       from_loading_204 = true; 
       window.top.location = '/?204'; 
       prevent_bust = false; 
      }else if(prevent_bust_timer == 1){ 
       frame_loading = false; 
       prevent_bust = false; 
       from_loading_204 = false; 
       prevent_bust_timer == 0; 
      } 



     } 
     prevent_bust_timer--; 
     if(prevent_bust_timer==-100) { 
      prevent_bust_timer = 0; 
     } 
    }, 1); 
</script> 

y onload="frameLoad()" y onreadystatechange="frameLoad();" se debe agregar a la estructura o marco flotante.

32

utilizo caja de arena = "..."

  • permitan formas permite el envío de formularios
  • allow-popups permite ventanas emergentes
  • allow-pointer-lock permite el bloqueo del puntero
  • allow-same-origin permite el documento para mantener su origen
  • permitir scripts permite la ejecución de JavaScript, y también permite funciones para activar automáticamente
  • permite de arriba de navegación permite que el documento para salir del cuadro por navegar por la ventana de nivel superior

La navegación superior es lo que desea evitar, así que déjelo y no se permitirá. Cualquier cosa omitida será bloqueada

ex.

 <iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms" src="http://www.example.com"</iframe> 
+1

Tenga en cuenta que Flash (y cualquier otro objeto) también se bloqueará, sin posibilidad de permitirlo. Esta "característica de seguridad" me impide usar sandbox todos juntos – oriadam

Cuestiones relacionadas