349 votos

Marco Buster Buster... código buster necesario

Digamos que usted no desea que otros sitios a "marco" de su sitio web en un <iframe>:

<iframe src="http://example.org"></iframe>

Para insertar anti-encuadre, marco revienta JavaScript en todas las páginas:

/* break us out of any containing iframes */
if (top != self) { top.location.replace(self.location.href); }

Excelente! Ahora "busto" o salir de cualquier contiene iframe automáticamente. Excepto por un pequeño problema.

Como resulta que, en el marco acabando con el código puede ser arrestado, como se muestra aquí:

<script type="text/javascript">
    var prevent_bust = 0  
    window.onbeforeunload = function() { prevent_bust++ }  
    setInterval(function() {  
      if (prevent_bust > 0) {  
        prevent_bust -= 2  
        window.top.location = 'http://example.org/page-which-responds-with-204'  
      }  
    }, 1)  
</script>

Este código hace lo siguiente:

  • incrementa un contador cada vez que el navegador intente navegar fuera de la página actual, a través de la window.onbeforeunload de controlador de eventos
  • establece un temporizador que se activa cada milisegundo a través de setInterval(), y si ve que el contador se incrementa, cambia la ubicación actual a un servidor del atacante del control
  • ese servidor sirve una página con código de estado HTTP 204, que no causa el navegador para desplazarse a cualquier lugar

Mi pregunta es ... y esto es más de un JavaScript rompecabezas de un real problema -- ¿cómo puede usted vencer el marco acabando con el buster?

Yo tenía un par de ideas, pero nada funcionó en mis pruebas:

  • intentar limpiar la onbeforeunload evento a través de onbeforeunload = null no tuvo ningún efecto
  • añadir un alert() detuvo el proceso que el usuario sepa de lo que estaba pasando, pero no interfieren con el código de cualquier manera; al hacer clic en ACEPTAR permite la revienta continuar de forma normal
  • No puedo pensar en alguna forma de borrar la setInterval() temporizador

Yo no soy mucho de un programador de JavaScript, así que aquí está mi reto: hey buster, puede romper el marco acabando con el buster?

174voto

EricLaw Puntos 28850

121voto

Hugoware Puntos 13645

No estoy seguro de si esto es viable o no - pero si usted no puede romper el marco, ¿por qué no mostrar una advertencia. Por ejemplo, Si tu página no es la "parte superior de la página" crear un método setInterval que intenta romper el marco. Si después de 3 o 4 intentos de su página aún no está la parte superior de la página a crear un elemento div que cubre toda la página (modal box) con un mensaje y un enlace como...

Usted está viendo esta página en un no autorizado marco de la ventana - (bla Bla... potencial problema de seguridad)

haga clic en este enlace para solucionar este problema

No es la mejor, pero yo no veo ninguna manera podían secuencia de comandos de su manera de salir de esa.

29voto

Jani Hartikainen Puntos 23183

Esto ocurrió, y parece funcionar al menos en Firefox.

if(top != self) {
 top.onbeforeunload = function() {};
 top.location.replace(self.location.href);
}

17voto

Josh Stodola Puntos 42410

Después de un rato pensando en esto, creo que esto les enseñará que tiene jefe...

if(top != self) {
  window.open(location.href, '_top');
}

Uso de _top como el parámetro target para window.open() a poner en marcha en la misma ventana.

13voto

coderrr Puntos 169

http://coderrr.wordpress.com/2009/06/18/anti-anti-Frame-Busting/

if (top != self) {  
  top.location.replace(document.location)  
  alert('busting you out, please wait...')  
}

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X