如何防止IFRAMEredirect顶层窗口
有些网站有代码“打破”的IFRAME
shell,这意味着如果一个页面A
作为一个IFRAME
加载在父页面P
一些Javascript在A
redirect到外部窗口。
通常这个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中工作。
通过这样做,你将能够控制框架页面的任何行动,这是你不能的。 同域来源策略适用。