如何防止IFRAME重定向顶级窗口

时间:2008-12-15 19:50:55

标签: javascript html iframe

某些网站的代码是“突破”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。在我看来,它应该是跨站点安全违规,但事实并非如此。

9 个答案:

答案 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 =“...”

  • 允许表单允许表单提交
  • allow-popups允许弹出窗口
  • allow-pointer-lock允许指针锁定
  • allow-same-origin允许文档保持其原点
  • allow-scripts允许JavaScript执行,并允许功能自动触发
  • allow-top-navigation允许文档通过导航顶级窗口突破框架

热门导航是您要阻止的内容,因此请将其保留,不允许使用。遗漏的任何内容都将被阻止

离。

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

答案 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适用。