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

Javascript 如何防止IFRAME重定向顶级窗口,javascript,html,iframe,Javascript,Html,Iframe,一些网站有代码可以“突破”IFRAME附件,这意味着如果一个页面a作为IFRAME加载到父页面p中,则a中的一些Javascript会将外部窗口重定向到a 此Javascript通常如下所示: <script type="text/javascript"> if (top.location.href != self.location.href) top.location.href = self.location.href; </script> if(to

一些网站有代码可以“突破”
IFRAME
附件,这意味着如果一个页面
a
作为
IFRAME
加载到父页面
p
中,则
a
中的一些Javascript会将外部窗口重定向到
a

此Javascript通常如下所示:

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

if(top.location.href!=self.location.href)
top.location.href=self.location.href;
我的问题是:作为父页面
p
的作者,而不是内部页面
A
的作者,我如何防止
A
发生这种情况


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

这样做,您就能够控制框架页面的任何操作,而这是您无法控制的。应用。

尝试使用onbeforeunload属性,该属性将允许用户选择是否要导航离开页面

例如:

在HTML5中,您可以使用沙盒属性。请看下面潘克拉的回答。

由于您在iframe中加载的页面可以使用设置间隔执行“中断”代码,因此onbeforeunload可能不太实用,因为它可能会使用“您确定要离开吗?”对话框提示用户

还有iframe安全属性,它仅适用于IE&Opera


:(

在我的例子中,我希望用户访问内部页面,以便服务器将其ip视为访问者。如果我使用php代理技术,我认为内部页面将我的服务器ip视为访问者,因此这并不好。到目前为止,我得到的唯一解决方案是wilth onbeforeunload。 把这个放在你的页面上:

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

window.onbeforeunload=函数(){
返回“这将结束您的会话”;
}
这在firefox和ie中都有效,这就是我测试的目的。
你会发现使用evt.return(无论什么)垃圾的版本在firefox中不起作用。

我发现了一些有用的漏洞:

在HTML5中添加了该属性。在撰写本文时,该属性基本上满足了您的需求:

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


如果您想允许顶级重定向,请指定
sandbox=“allow top navigation”

我知道问题解决已经很久了,但这是我的改进版本,只有在加载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>

var-provent\u-bust=false;
来自_加载_204的变量=false;
var frame_加载=错误;
var-provent\u-bust\u-timer=0;
var-primer=true;
window.onbeforeunload=函数(事件){
防止胸围=!从框架加载到框架加载;
如果(从_加载_204)从_加载_204=false;
如果(防止破产){
防砸定时器=500;
}
}
函数frameLoad(){
如果(!底漆){
from_loading_204=真;
window.top.location='/-204';
防止错误;
帧加载=真;
防砸定时器=1000;
}否则{
引物=假;
}
}
setInterval(函数(){
如果(阻止计时器>0){
如果(防止破产){
from_loading_204=真;
window.top.location='/-204';
防止错误;
}else if(阻止\u bust\u计时器==1){
帧加载=假;
防止错误;
from_loading_204=假;
阻止计时器==0;
}
}
防止崩溃计时器--;
如果(防止计时器==-100){
阻止计时器=0;
}
}, 1);
必须将
onload=“frameLoad()”
onreadystatechange=“frameLoad();”
添加到帧或iframe中。

在阅读后。我找到了沙盒属性

您可以设置
sandbox=“
”,这会阻止iframe重定向。也就是说,它不会重定向iframe。您将失去单击

此处示例:
没有沙盒的示例:

我使用沙盒标记

  • 允许表单
    允许表单提交
  • 允许弹出窗口
    允许弹出窗口
  • 允许指针锁定
    允许指针锁定
  • 允许相同来源
    允许文档保留其来源
  • allow scripts
    允许JavaScript执行,还允许自动触发功能
  • allow top navigation
    允许文档通过导航顶级窗口脱离框架
顶部导航是您想要阻止的,因此将其忽略,它将不被允许。忽略的任何内容都将被阻止


如果你不是框架内容的作者,我认为你根本做不了什么。我不是要求控制IFRAME内部的内容。我是要求防止IFRAME内部的内容控制我。但是,IFRAME允许跨域通信,使用
postMessage
。这不是安全风险,但可能有人不在乎o当他们看到您的评论时,知道此功能存在。:)在撰写此答案时,这是不可能的。谢谢你指出。@SirDarius你能举个例子吗,非常感谢。@fasih.rana第二篇文章对我帮助很大。谢谢;)为SCORM LMS集成(cloud.SCORM.com)工作。三天的调试终于由您的答案节省下来了,非常感谢您对stackoverflow的贡献。等等。。。什么?他们让你这么做?我想如果一个网站想要突破,所有的浏览器都会同意。有了这一点,人们应该如何让他们的网站远离iFrame?不过我不是在抱怨,太棒了。这里有解药:@StephenSarcsamKamenar如果你想保护你的网站不被显示在iframe中,有X-Frame-Options标题可用