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?
javascript
html
iframe
framebusting
Jeff Atwood
fuente
fuente
example.org
como se especifica en RFC 2606 ietf.org/rfc/rfc2606.txtRespuestas:
No estoy seguro de si esto es viable o no, pero si no puede romper el marco, ¿por qué no simplemente mostrar una advertencia? Por ejemplo, si su página no es la "página superior", cree un método setInterval que intente romper el marco. Si después de 3 o 4 intentos su página aún no es la página superior, cree un elemento div que cubra toda la página (cuadro modal) con un mensaje y un enlace como ...
No es el mejor, pero no veo ninguna forma en que puedan salir de eso.
fuente
document.write("");
(después de haber establecido que está siendo enmarcadoFwiw, la mayoría de los navegadores actuales apoyan los X-Frame-Options: negar directiva, que funciona incluso cuando la escritura se desactiva.
IE8:
http://blogs.msdn.com/ie/archive/2009/01/27/ie8-security-part-vii-clickjacking-defenses.aspx
Firefox (3.6.9)
https://bugzilla.mozilla.org/show_bug.cgi?id=475530
https://developer.mozilla.org/en/The_X-FRAME-OPTIONS_response_header
Chrome / Webkit
http://blog.chromium.org/2010/01/security-in-depth-new-security-features.html
http://trac.webkit.org/changeset/42333
fuente
Hemos utilizado el siguiente enfoque en uno de nuestros sitios web desde http://seclab.stanford.edu/websec/framebusting/framebust.pdf
fuente
Se le ocurrió esto, y parece funcionar al menos en Firefox y el navegador Opera.
fuente
onbeforeunload
controladores, ¡no solo el que está arriba!Teniendo en cuenta el estándar HTML5 actual que introdujo el sandbox para el iframe, todos los códigos de eliminación de fotogramas que se proporcionan en esta página se pueden deshabilitar cuando el atacante usa el sandbox porque restringe el iframe de lo siguiente:
Consulte: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-iframe-element.html#attr-iframe-sandbox
Ahora, considere que el atacante usó el siguiente código para alojar su sitio en iframe:
Entonces, todo el código de ruptura de trama de JavaScript fallará.
Después de verificar todo el código de bus de trama, solo esta defensa funciona en todos los casos:
propuesta originalmente por Gustav Rydstedt, Elie Bursztein, Dan Boneh y Collin Jackson (2010)
fuente
Después de reflexionar sobre esto por un momento, creo que esto les mostrará quién es el jefe ...
Usar
_top
como parámetro de destinowindow.open()
lo iniciará en la misma ventana.fuente
fuente
Voy a ser valiente y arrojar mi sombrero en el ring en este (antiguo como es), ver cuántos votos negativos puedo recoger.
Aquí está mi intento, que parece funcionar en todas partes donde lo he probado (Chrome20, IE8 y FF14):
Puse este código en
<head>
y lo llamé desde el final<body>
para asegurarme de que mi página se muestre antes de que comience a discutir con el código malicioso, no sé si este es el mejor enfoque, YMMV.¿Como funciona?
... te escucho preguntar, bueno, la respuesta sincera es que realmente no lo sé. Me costó mucho trabajo hacer que funcionara en todos los lugares que estaba probando, y el efecto exacto que tiene varía ligeramente dependiendo de dónde lo ejecute.
Aquí está el pensamiento detrás de esto:
Para mi
http://mysite.tld/page-that-takes-a-while-to-load
(el objetivo del XHR) utilicé un script PHP que se ve así:¿Lo que pasa?
¿No puedes evitar el tiempo de espera en Chrome y Firefox?
Aparentemente no. Al principio apunté el XHR a una URL que devolvería un 404; esto no funcionó en Firefox. Luego probé el
sleep(5);
enfoque que finalmente obtuve para esta respuesta, luego comencé a jugar con la duración del sueño de varias maneras. No pude encontrar un patrón real para el comportamiento, pero sí encontré que si es demasiado corto, específicamente Firefox no jugará a la pelota (Chrome e IE parecen comportarse bastante bien). No sé cuál es la definición de "demasiado corto" en términos reales, pero 5 segundos parecen funcionar cada vez.Si algún ninjas de Javascript que pasa quiere explicar un poco mejor lo que está sucediendo, por qué esto (probablemente) es incorrecto, poco confiable, el peor código que han visto, etc. Estaré encantado de escucharlo.
fuente
A partir de 2015, debe usar la
frame-ancestors
directiva CSP2 para esto. Esto se implementa a través de un encabezado de respuesta HTTP.p.ej
Por supuesto, no muchos navegadores admiten CSP2 todavía, por lo que es aconsejable incluir el
X-Frame-Options
encabezado anterior:Aconsejaría incluir ambos de todos modos, de lo contrario su sitio continuaría siendo vulnerable a los ataques de Clickjacking en navegadores antiguos, y por supuesto obtendría un marco indeseable incluso sin intenciones maliciosas. La mayoría de los navegadores se actualizan automáticamente en estos días, sin embargo, todavía tiende a hacer que los usuarios corporativos se atasquen en versiones antiguas de Internet Explorer por razones de compatibilidad de aplicaciones heredadas.
fuente
Ok, entonces sabemos que estaban en un marco. Entonces ubicamos.href a otra página especial con la ruta como una variable GET. Ahora explicamos al usuario lo que está sucediendo y proporcionamos un enlace con una opción target = "_ TOP". Es simple y probablemente funcionaría (no lo he probado), pero requiere cierta interacción del usuario. Tal vez podría señalar el sitio ofensivo para el usuario y hacer una vergüenza de clickers a su sitio en alguna parte ... Solo una idea, pero funciona de noche ...
fuente
Todas las soluciones propuestas fuerzan directamente un cambio en la ubicación de la ventana superior. ¿Qué pasa si un usuario quiere que el marco esté allí? Por ejemplo, el cuadro superior en los resultados de imagen de los motores de búsqueda.
Escribí un prototipo donde, por defecto, todas las entradas (enlaces, formularios y elementos de entrada) están deshabilitadas y / o no hacen nada cuando se activan.
Si se detecta un marco contenedor, las entradas quedan deshabilitadas y se muestra un mensaje de advertencia en la parte superior de la página. El mensaje de advertencia contiene un enlace que abrirá una versión segura de la página en una nueva ventana. Esto evita que la página se use para hacer clickjacking, al tiempo que permite al usuario ver el contenido en otras situaciones.
Si no se detecta un marco que contenga, las entradas están habilitadas.
Aquí está el código. Debe establecer los atributos HTML estándar en valores seguros y agregar atributos adicionales que contengan los valores reales. Probablemente esté incompleto y para mayor seguridad, los atributos adicionales (estoy pensando en los controladores de eventos) probablemente tendrán que ser tratados de la misma manera:
fuente
Bueno, puede modificar el valor del contador, pero obviamente es una solución frágil. Puede cargar su contenido a través de AJAX después de haber determinado que el sitio no está dentro de un marco, tampoco es una gran solución, pero con suerte evita que se active el evento antes de la descarga (supongo).
Editar: otra idea. Si detecta que está en un marco, pídale al usuario que desactive JavaScript, antes de hacer clic en un enlace que lo lleve a la URL deseada (pasando una cadena de consulta que le permita a su página decirle al usuario que puede volver a habilitar JavaScript una vez que hay).
Edición 2: Vuélvase nuclear: si detecta que está en un marco, simplemente elimine el contenido del cuerpo del documento e imprima un mensaje desagradable.
Edición 3: ¿Puede enumerar el documento superior y establecer todas las funciones en nulas (incluso las anónimas)?
fuente
<body>
interior en una<plaintext>
etiqueta configuradadisplay: none
. Es bastante efectivoSi agrega una alerta justo después del código buster, entonces la alerta detendrá el hilo de JavaScript y permitirá que se cargue la página. Esto es lo que hace StackOverflow, y sale de mis iframes, incluso cuando uso el buster buster buster. También funcionó con mi página de prueba simple. Esto solo se ha probado en Firefox 3.5 e IE7 en Windows.
Código:
fuente
Creo que ya casi estabas allí. Has probado:
o alternativamente:
Nota: en realidad no probé esto.
fuente
¿Qué hay de llamar al buster repetidamente también? Esto creará una condición de carrera, pero uno puede esperar que el destructor salga ganando:
fuente
Si observa los valores devueltos por
setInterval()
ellos, generalmente son de un solo dígito, por lo que generalmente puede deshabilitar todas esas interrupciones con una sola línea de código:fuente
Es posible que haya conseguido una forma de reventar el frame buster buster javascript. Usando getElementsByName en mi función javascript, establecí un bucle entre el frame buster y el script real del buster buster. mira esta publicación http://www.phcityonweb.com/frame-buster-buster-buster-2426
fuente
setInterval y setTimeout crean un intervalo de incremento automático. Cada vez que se llama a setTimeout o setInterval, este número aumenta en uno, de modo que si llama a setTimeout, obtendrá el valor más alto actual.
Dado que es casi inaudito que haya 10000 setIntervals y setTimeouts simultáneos funcionando, y que setTimeout devuelve "último intervalo o tiempo de espera creado + 1", y dado que top.clearInterval sigue siendo accesible, esto derrotará los ataques de sombrero negro para enmarcar sitios web que se describen anteriormente.
fuente
Use htaccess para evitar el conjunto de marcos de jacking alto, iframe y cualquier contenido como imágenes.
Esto mostrará una página de derechos de autor en lugar de la esperada.
fuente
<meta name="referrer" …/>
yb) también se establece al hacer clic en los enlaces, por lo que también no permite enlaces a su página y se rompe La web.