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

问题描述 投票:0回答:10

某些网站具有“突破”

IFRAME
外壳的代码,这意味着如果页面
A
作为父页面中的
IFRAME
加载,
P
中的某些Javascript会将外部窗口重定向到
 A

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

A

我的问题是:作为父页面
<script type="text/javascript"> if (top.location.href != self.location.href) top.location.href = self.location.href; </script>

的作者而不是内页

P
的作者,我怎样才能阻止
A
进行这种突破?

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

javascript html iframe
10个回答
138
投票
iframe sandbox

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

如果您想
允许

顶级重定向,请指定<iframe src="url" sandbox="allow-forms allow-scripts"></iframe>

    


66
投票
sandbox="allow-top-navigation"

元素上使用

sandbox
属性

    iframe
  • 允许提交表单
  • allow-forms
  • 允许弹出窗口
  • allow-popups
  • 允许指针锁定
  • allow-pointer-lock
  • 允许文档保持其来源
  • allow-same-origin
  • 允许执行JavaScript,还允许自动触发功能
  • allow-scripts
  • 允许文档通过导航顶级窗口来突破框架
    
    
顶部导航是您想要阻止的内容,因此将其排除在外,这样就不会被允许。剩下的都会被屏蔽

例如。

allow-top-navigation



44
投票

示例:

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

在 HTML5 中,您可以使用沙箱属性。请参阅下面 Pankrat 的回答。

http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/


11
投票
w3.org 规范后

。我找到了沙盒属性。 您可以设置

<iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms" src="http://www.example.com"</iframe>

,这可以防止 iframe 重定向。话虽这么说,它也不会重定向 iframe。您基本上会失去点击次数。


示例如下:

http://jsfiddle.net/ppkzS/1/

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


4
投票

sandbox=""

<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()"
必须添加到框架或 iframe 中。
    


2
投票

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

:(


2
投票

onreadystatechange="frameLoad();"

这在 Firefox 和 ie 中都有效,这就是我测试的结果。
你会发现使用诸如 evt.return(whatever) 之类的东西的版本...在 firefox 中不起作用。


1
投票

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



0
投票
<iframe sandbox=" "></iframe>

事件,并在发生更改时更正它的

onload
。 iframe 闪烁,但这对我来说没问题。
src



-1
投票
同域来源政策

适用。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.