Supongamos que no desea que otros sitios "enmarquen" su sitio en un <iframe>
:
<iframe src="http://example.org"></iframe>
Entonces inserta JavaScript anti-framing, frame busting en todas sus páginas:
/* break us out of any containing iframes */
if (top != self) { top.location.replace(self.location.href); }
¡Excelente! Ahora se "rompe" o se libera automáticamente de cualquier iframe que lo contenga. Excepto por un pequeño problema.
Como resultado, su código de ruptura de trama puede romperse , 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 intenta navegar fuera de la página actual, a través del
window.onbeforeunload
controlador de eventos - configura un temporizador que dispara cada milisegundo a través de
setInterval()
, y si ve que el contador se incrementa, cambia la ubicación actual a un servidor de control del atacante - ese servidor sirve una página con el código de estado HTTP 204 , que no hace que el navegador navegue a ningún lado
Mi pregunta es, y esto es más un rompecabezas de JavaScript que un problema real , ¿cómo puede derrotar al destructor de marcos?
Tuve algunos pensamientos, pero nada funcionó en mis pruebas:
- intentar borrar el
onbeforeunload
eventoonbeforeunload = null
no tuvo efecto - al agregar y
alert()
detener el proceso, el usuario sabe que estaba sucediendo, pero no interfiere con el código de ninguna manera; Al hacer clic en Aceptar, el revés continúa de manera normal - No se me ocurre ninguna forma de borrar el
setInterval()
temporizador
No soy un gran programador de JavaScript, así que este es mi desafío para ti: hey buster, ¿puedes reventar el buster buster?
example.org
como se especifica en RFC 2606 ietf.org/rfc/rfc2606.txt