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

Jas*_*hen 123 html javascript 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>
Run Code Online (Sandbox Code Playgroud)

我的问题是:作为父页面P的作者而不是内页的作者,AA该如何防止这种突破呢?

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

Pan*_*rat 120

使用HTML5,添加了iframe沙箱属性.在撰写本文时,这适用于Chrome,Safari,Firefox以及IE和Opera的最新版本,但可以满足您的需求:

<iframe src="url" sandbox="allow-forms allow-scripts"></iframe>
Run Code Online (Sandbox Code Playgroud)

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

  • 不幸的是,`sandbox`不允许在沙盒框架中使用Flash或任何其他类型的对象,这使得`sandbox`功能在许多情况下无用. (4认同)
  • 这是解药:http://blogs.msdn.com/b/ieinternals/archive/2010/03/30/combating-clickjacking-with-x-frame-options.aspx (3认同)
  • @StephenSarcsamKamenar 如果您想保护您的网站不被显示在 iframe 中,则可以使用带有 **SAMEORIGIN** 值的 **X-Frame-Options** 标头。大多数现代浏览器不会使用此标题在 iframe 中显示站点。 (3认同)

小智 44

我用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>
Run Code Online (Sandbox Code Playgroud)

  • 请注意,Flash(和任何其他对象)也将被阻止,没有允许它的选项.这个"安全功能"阻止我一起使用沙盒 (2认同)

fas*_*ana 41

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

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

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


Par*_*ris 8

阅读完w3.org规范后.我找到了沙盒属性.

您可以设置sandbox="",以防止iframe重定向.据说它也不会重定向iframe.你基本上会失去点击.

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


小智 5

我知道自从问题解决以来已经很长时间了,但这是我的改进版本,只有在加载 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>
Run Code Online (Sandbox Code Playgroud)

onload="frameLoad()"onreadystatechange="frameLoad();"必须被添加到该帧或iframe。