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

IT技术 javascript html iframe
2021-01-20 18:54:44

一些网站有代码来“突破”IFRAME附件,这意味着如果页面A作为IFRAME父页面内部加载,则P某些 JavascriptA会将外部窗口重定向到A.

通常这个 Javascript 看起来像这样:

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

我的问题是:作为父页面P的作者而不是内页的作者,A我怎样才能防止A这种突破?

PS 在我看来,它应该是跨站点安全违规,但事实并非如此。

6个回答

在 HTML5 中,添加iframe 沙箱属性。在撰写本文时,它适用于 Chrome、Safari、Firefox 以及最新版本的 IE 和 Opera,但几乎可以满足您的需求:

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

如果要允许顶级重定向,请指定sandbox="allow-top-navigation".

不幸的是sandbox,沙盒框架中不允许 Flash 或任何其他类型的对象,这使得该sandbox功能在许多情况下无用。
2021-03-14 18:54:44
等等……什么?他们让你这样做?我想如果一个网站想要突破,所有的浏览器都会允许的。人们应该如何使他们的网站远离 iframe 呢?不过我没有抱怨,太棒了。
2021-03-23 18:54:44
@StephenSarcsamKamenar 如果您想保护您的网站不被显示在 iframe 中,则可以使用带有SAMEORIGIN值的X-Frame-Options标头大多数现代浏览器不会在 iframe 中显示带有此标题的站点。
2021-03-26 18:54:44
网站不应“爆发”以抗议被包含在 iframe 中。他们可以简单地显示一条消息或空白。不幸的是,允许脚本在 iframe 中运行仍然会让你看到一个运行 while(1) {} 和其他无限循环的流氓 iframe。我希望每个 iframe 都可以有自己的线程。
2021-04-03 18:54:44
2021-04-05 18:54:44

我使用沙箱标签

  • allow-forms 允许表单提交
  • 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>
请注意,Flash(和任何其他对象)也将被阻止,无法选择允许它。这个“安全功能”阻止我一起使用沙箱
2021-04-08 18:54:44

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

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

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

适用于 SCORM LMS 集成 (cloud.scorm.com)。三天的调试终于被您的回答节省了,非常感谢对 stackoverflow 的贡献。
2021-03-18 18:54:44
@SirDarius 能否请您举个例子,非常感谢。
2021-03-21 18:54:44
但是,iFrame确实允许跨域通信,使用postMessage. 这不是安全风险,但当有人看到您的评论时,他们可能想知道此功能存在。:)
2021-03-25 18:54:44
@fasih.rana 第二篇文章对我帮助很大。谢谢 ;)
2021-04-04 18:54:44
在撰写此答案时,这是不可能的。谢谢你指出。
2021-04-07 18:54:44

阅读w3.org 规范后我找到了沙箱属性。

您可以设置sandbox="",这可以防止 iframe 重定向。话虽如此,它也不会重定向 iframe。您将基本上失去点击。

这里的例子: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。