如何优雅地处理iframe断路器?

时间:2009-11-08 07:01:18

标签: javascript jquery iframe

据我所知,没有办法杀死iframe断路器...但是,我想知道,有没有办法优雅地处理它。

到目前为止,我使用<body onunload="function();">设法在退出之前检测到它。我想知道是否可以阻止它加载iframe或强制它在新窗口中打开等。

干杯, 米奇

3 个答案:

答案 0 :(得分:6)

事实上,你可以实际做你真正想做的事情,即bust the iframe buster。该技术允许您使用onbeforeunload将页面切换回您的页面,但间接地,因为浏览器太聪明,无法让您在onbeforeunload中设置URL。因此,onbeforeunload设置一个指示符变量来标记URL已更改,并使用在页面加载时建立的setInterval例程定期轮询该变量。只要您足够快地轮询以捕获变量,您就可以自己跳转并更改页面的URL。诀窍是将其更改为返回204的页面,这是一个特殊状态,告诉浏览器单独离开当前页面。

那就是说,这是一场猫捉老鼠的游戏。查看Jeff Attwood's StackOverflow question on this,在那里他询问如何破坏上述技巧。网页可以通过击败轮询间隔来破坏破坏者;基本上,他们将URL设置为指向一个小页面,以及一个已经缓存的页面。一旦URL更改为该页面,它将加载得比轮询例程可以跳入更快,并注意到指示符变量已更改。

首先要防止装入框架并不容易。如果您真的想要,可以让您的服务器下载页面并解析Javascript以查看是否存在iframe破坏技术。但是,如果没有模拟浏览器,您只能依赖基本的模式匹配,并且页面很容易绕过它。 (例如,使用top [“l”+“ocation”]而不是top.location)。

更智能的技术是跟踪哪些URL使用Ajax请求重定向回服务器。 (例如,如果iframe在加载后仍然存在,则将Ajax请求发送回您的服务器)。您无法100%保证这些请求的准确性,因为它们来自浏览器,但您至少可以使用它们来构建手动黑名单。

您也无法强制iframe突破到另一个窗口。

答案 1 :(得分:2)

您可以使用HTML5中引入的the sandbox attribute来阻止iframe破坏。只是不要在白名单中包含allow-top-navigation

<iframe sandbox="allow-forms allow-popups allow-pointer-lock allow-same-origin allow-scripts"
src="foo.html"></iframe>

答案 2 :(得分:0)

您是在谈论嵌入式iframe设置top.location吗?据我所知,没有办法阻止这种情况。

如果您担心iframe的内容做了您不想要的事情,您可以考虑清理该框架的内容并自行托管。显然这非常棘手,但它几乎是唯一真正的解决方案。有关执行此操作的项目,请参阅Caja。这限制了你实际上可以托管的东西(例如,如果您托管的代码使用XHR,那么你就不用运气了。)