首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何防止IFRAME重定向顶级窗口

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

Stack Overflow用户
提问于 2008-12-15 19:50:55
回答 7查看 222.7K关注 0票数 140

一些网站具有“突破”IFRAME封装的代码,这意味着如果页面A作为父页面P内的IFRAME加载,A中的一些Javascript会将外部窗口重定向到A

通常,此Javascript如下所示:

代码语言:javascript
运行
复制
<script type="text/javascript">
  if (top.location.href != self.location.href)
     top.location.href = self.location.href;
</script>

我的问题是:作为父页面P的作者,而不是内部页面A的作者,我如何防止A进行这种突破?

附注:在我看来,这应该是一个跨站点的安全违规行为,但事实并非如此。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2008-12-15 20:21:36

尝试使用onbeforeunload属性,该属性将让用户选择是否要离开页面。

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

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

票数 44
EN

Stack Overflow用户

发布于 2013-08-06 14:36:09

在阅读了w3.org spec之后。我找到了沙盒的属性。

您可以设置sandbox="",这会阻止iframe重定向。也就是说,它也不会重定向iframe。你将会从根本上失去点击。

示例如下:http://jsfiddle.net/ppkzS/1/

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

票数 9
EN

Stack Overflow用户

发布于 2012-08-04 00:03:59

我知道问题已经有很长一段时间了,但这是我的改进版本,只有在加载iframe时,它才会等待500ms等待任何后续调用。

代码语言:javascript
运行
复制
<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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/369498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档