javascript - prevent - sandbox allow top navigation allow scripts allow forms
Cómo evitar que IFRAME redirija la ventana de nivel superior (9)
Al hacerlo, podrás controlar cualquier acción de la página enmarcada, lo cual no puedes hacer. Se aplica la política de origen del mismo dominio .
Algunos sitios web tienen un código para "salir" de los alojamientos IFRAME
, lo que significa que si una página A
se carga como un IFRAME
dentro de una página principal P
algunos Javascript en A
redirigen la ventana externa a A
Por lo general, este Javascript se ve más o menos así:
<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 padre P
y no siendo el autor de la página interior A
, ¿cómo puedo evitar que A
haga esta ruptura?
PD: me parece que debería ser una violación de seguridad entre sitios, pero no lo es.
Como la página que carga dentro del iframe puede ejecutar el código "break out" 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 está el atributo de seguridad iframe que solo funciona en IE & Opera
:(
Con HTML5, se agregó el atributo sandbox iframe . En el momento de escribir esto, esto funciona en Chrome, Safari, Firefox y versiones recientes de IE y Opera, pero hace más o menos lo que usted desea:
<iframe src="url" sandbox="allow-forms allow-scripts"></iframe>
Si desea permitir redirecciones de nivel superior, especifique sandbox="allow-top-navigation"
.
Después de leer la especificación w3.org . Encontré la propiedad de la caja de arena.
Puede establecer sandbox=""
, lo que evita que el iframe se redirija. Dicho esto, tampoco redirigirá el iframe. Perderás el clic esencialmente.
Ejemplo aquí: http://jsfiddle.net/ppkzS/1/
Ejemplo sin sandbox: http://jsfiddle.net/ppkzS/
En mi caso, quiero que el usuario visite la página interna para que el servidor vea su IP como visitante. Si utilizo la técnica de proxy php, creo que la página interna verá mi servidor ip como visitante, por lo que no es bueno. La única solución que obtuve hasta ahora es la de antes de descargar. 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 y es decir, eso es lo que probé. encontrarás versiones que usan algo como evt.return (lo que sea) basura ... eso no funciona en Firefox.
He encontrado algunos hacks útiles en esto:
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/
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 usar la propiedad de espacio aislado. Por favor, vea la respuesta de Pankrat a continuación. http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/
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.
<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();"
debe agregarse al marco o al marco flotante.
Yo uso sandbox = "..."
- allow-forms permite el envío de formularios
- permitir-popups permite pop-ups
- allow-pointer-lock permite el bloqueo del puntero
- permitir el mismo origen permite que el documento mantenga su origen
- allow-scripts permite la ejecución de JavaScript y también permite que las características se activen automáticamente
- allow-top-navigation permite que el documento salga del marco navegando 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 que quede será bloqueada
ex.
<iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms" src="http://www.example.com"</iframe>