如何防止IFRAMEredirect顶层窗口

有些网站有代码“打破”的IFRAMEshell,这意味着如果一个页面A作为一个IFRAME加载在父页面P一些Javascript在Aredirect到外部窗口。

通常这个Javascript看起来像这样:

 <script type="text/javascript"> if (top.location.href != self.location.href) top.location.href = self.location.href; </script> 

我的问题是:作为父页P的作者,而不是内页A ,我怎样才能防止A做这个突破?

PS在我看来,它应该是一个跨站点安全违规,但事实并非如此。

尝试使用onbeforeunload属性,这会让用户select是否要从页面导航。

例如: https : //developer.mozilla.org/en-US/docs/Web/API/Window.onbeforeunload

在HTML5中,您可以使用沙箱属性。 请参阅下面的Pankrat的答案。 http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/

在HTML5中添加了iframe沙箱属性。 在编写这个作品的时候,Chrome,Safari,Firefox和IE和Opera的最新版本,但是几乎你想要的东西:

 <iframe src="url" sandbox="allow-forms allow-scripts"></iframe> 

如果您想允许顶级redirect,请指定sandbox="allow-top-navigation"

我使用沙箱=“…”

  • 允许表单允许表单提交
  • 允许popup允许popup窗口
  • allow-pointer-lock允许指针locking
  • 允许同源允许文件保持其原点
  • allow-scripts允许JavaScript执行,还允许自动触发function
  • 允许顶部导航允许文档通过导航顶层窗口而跳出框架

顶部的导航是你想要防止的,所以留下来,这将不被允许。 任何遗漏将被阻止

恩。

  <iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms" src="http://www.example.com"</iframe> 

阅读w3.org规范后 。 我find了沙箱属性。

你可以设置sandbox="" ,防止iframeredirect。 这是说,它也不会redirectiframe。 本质上你将失去点击。

示例: http : //jsfiddle.net/ppkzS/1/
没有沙箱的示例: http : //jsfiddle.net/ppkzS/

我知道问题已经很长时间了,但是这里是我改进后的版本,只有当iframe被加载后,它才会等待500毫秒的后续调用。

 <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> 

onload="frameLoad()"onreadystatechange="frameLoad();" 必须添加到框架或iframe。

我发现这一些有用的黑客攻击:

使用JS我怎么能阻止子iframe从redirect或至less提示用户redirect

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/

由于您在iframe中加载的页面可以使用setInterval执行“break out”代码,因此onbeforeunload可能并不实用,因为它可能会让用户感到“你确定要离开吗? 对话框。

还有只能在IE和Opera上使用的iframe安全属性

🙁

在我的情况下,我希望用户访问内部页面,以便服务器将看到他们的IP作为访问者。 如果我使用php代理技术,我认为内部页面将看到我的服务器IP作为访客,所以它不好。 我到目前为止唯一的解决scheme将是onbeforeunload。 把它放在你的页面上:

 <script type="text/javascript"> window.onbeforeunload = function () { return "This will end your session"; } </script> 

这在Firefox和ie都有效,那就是我所testing的。 你会发现使用类似evt.return(无论)废话的东西…这不能在Firefox中工作。

通过这样做,你将能够控制框架页面的任何行动,这是你不能的。 同域来源策略适用。