Algunos sitios web tienen un código para "salir" de los IFRAME
recintos, lo que significa que si una página A
se carga como IFRAME
dentro de una página principal, P
algunos JavaScript A
redirigen la ventana exterior A
.
Por lo general, este Javascript se parece a esto:
<script type="text/javascript">
if (top.location.href != self.location.href)
top.location.href = self.location.href;
</script>
Mi pregunta es: como autor de la página principal P
y no siendo el autor de la página interna A
, ¿cómo puedo evitar A
hacer este desglose?
PD: Me parece que debería ser una violación de seguridad entre sitios, pero no lo es.
javascript
html
iframe
Jason Cohen
fuente
fuente
Respuestas:
Intente usar 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 puedes usar la propiedad sandbox. Por favor, consulte la respuesta de Pankrat a continuación. http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/
fuente
postMessage
. Esto no es un riesgo de seguridad, pero a alguien le puede interesar saber que esta capacidad existe cuando ve su comentario. :)sandbox
.Con HTML5 se agregó el atributo de caja de arena de iframe . Al momento de escribir esto, funciona en Chrome, Safari, Firefox y versiones recientes de IE y Opera, pero hace más o menos lo que quieres:
Si desea permitir redirecciones de nivel superior, especifique
sandbox="allow-top-navigation"
.fuente
sandbox
, no permite Flash ni ningún otro tipo de objeto en el marco de espacio aislado, lo que hace que lasandbox
función sea inútil en muchos casos.Yo uso sandbox = "..."
La navegación superior es lo que desea evitar, así que no lo permita y no se permitirá. Todo lo que quede fuera será bloqueado
ex.
fuente
Después de leer la especificación w3.org . Encontré la propiedad sandbox.
Puede configurar
sandbox=""
, lo que evita que el iframe se redirija. Dicho esto, tampoco redirigirá el iframe. Perderá el clic esencialmente.Ejemplo aquí: http://jsfiddle.net/ppkzS/1/
Ejemplo sin sandbox: http://jsfiddle.net/ppkzS/
fuente
Sé que ha pasado mucho tiempo desde que se hizo la pregunta, pero aquí está mi versión mejorada, esperará 500 ms para cualquier llamada posterior solo cuando se cargue el iframe.
y
onload="frameLoad()"
yonreadystatechange="frameLoad();"
deben agregarse al marco o al iframe.fuente
He encontrado algunos trucos útiles en esto:
Usando JS, ¿cómo puedo evitar que los iframes secundarios redirijan o al menos preguntar a los usuarios sobre la redirección
http://www.codinghorror.com/blog/2009/06/we-done-been-framed.html
http://coderrr.wordpress.com/2009/02/13/preventing-frame-busting-and-click-jacking-ui-redressing/
fuente
Dado que la página que carga dentro del iframe puede ejecutar el código de "ruptura" con un setInterval, onbeforeunload podría no ser tan práctico, ya que podría confundir al usuario con '¿Está seguro de que quiere irse?' diálogos
También existe el atributo de seguridad iframe que solo funciona en IE y Opera
:(
fuente
En mi caso, quiero que el usuario visite la página interna para que el servidor vea su IP como visitante. Si uso la técnica de proxy php, creo que la página interna verá la dirección IP de mi servidor como visitante, por lo que no es bueno. La única solución que obtuve hasta ahora es antes de la descarga. Pon esto en tu página:
Esto funciona tanto en Firefox como en eso es lo que probé. encontrarás versiones que usan algo como evt.return (lo que sea) basura ... que no funciona en firefox.
fuente
Al hacerlo, podrá controlar cualquier acción de la página enmarcada, que no puede. Se aplica la política de origen del mismo dominio .
fuente