某些网站的代码是“突破”IFRAME
附件,这意味着如果页面A
作为IFRAME
加载到父页面P
中,则有些Javascript在A
中,将外窗口重定向到A
。
通常这个Javascript看起来像这样:
<script type="text/javascript">
if (top.location.href != self.location.href)
top.location.href = self.location.href;
</script>
我的问题是:作为父网页P
的作者而不是内页A
的作者,如何阻止A
进行此突破?
P.S。在我看来,它应该是跨站点安全违规,但事实并非如此。
答案 0 :(得分:118)
使用HTML5,添加了iframe sandbox属性。在撰写本works on Chrome, Safari, Firefox and recent versions of IE and Opera时,您可以完成您想要的任务:
<iframe src="url" sandbox="allow-forms allow-scripts"></iframe>
如果您想要允许顶级重定向,请指定sandbox="allow-top-navigation"
。
答案 1 :(得分:40)
尝试使用onbeforeunload属性,该属性将允许用户选择是否要离开页面。
示例:https://developer.mozilla.org/en-US/docs/Web/API/Window.onbeforeunload
在HTML5中,您可以使用沙盒属性。请参阅下面的Pankrat的回答。 http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/
答案 2 :(得分:39)
我使用sandbox =“...”
热门导航是您要阻止的内容,因此请将其保留,不允许使用。遗漏的任何内容都将被阻止
离。
<iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms" src="http://www.example.com"</iframe>
答案 3 :(得分:7)
阅读w3.org spec后。我找到了沙盒属性。
您可以设置sandbox=""
,以防止iframe重定向。据说它也不会重定向iframe。你基本上会失去点击。
此处示例:http://jsfiddle.net/ppkzS/1/
没有沙箱的示例:http://jsfiddle.net/ppkzS/
答案 4 :(得分:4)
我知道问题已经进行了很长时间但是这里是我的改进版本,只有在加载iframe时,它才会等待500ms以进行任何后续调用。
<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。
答案 5 :(得分:3)
我发现了一些有用的黑客:
Using JS how can I stop child Iframes from redirecting or at least prompt users about the 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/
答案 6 :(得分:2)
由于您在iframe中加载的页面可以使用setInterval执行“break out”代码,因此onbeforeunload可能不那么实用,因为它可能会让用户感到“你确定要离开吗?”对话框。
还有iframe安全属性,仅适用于IE&amp;歌剧
:(
答案 7 :(得分:2)
在我的情况下,我希望用户访问内部页面,以便服务器将其IP视为访问者。如果我使用PHP代理技术,我认为内页将看到我的服务器IP作为访问者,所以它不好。到目前为止,我得到的唯一解决方案是onbeforeunload。 把它放在你的页面上:
<script type="text/javascript">
window.onbeforeunload = function () {
return "This will end your session";
}
</script>
这适用于firefox和ie,这就是我测试的内容。 你会发现使用类似evt.return(无论如何)垃圾的版本......这在firefox中不起作用。
答案 8 :(得分:0)
通过这样做,您可以控制框架页面的任何操作,但您无法控制。 Same-domain origin policy适用。