【发布时间】:2009-11-08 07:01:17
【问题描述】:
我知道没有办法杀死 iframe 断路器......但是,我想知道,有没有办法优雅地处理它。
到目前为止,我设法在退出之前使用<body onunload="function();"> 检测到它。我想知道是否可以阻止它加载 iframe 或强制它在新窗口中打开等。
干杯, 米奇
【问题讨论】:
标签: javascript jquery iframe
我知道没有办法杀死 iframe 断路器......但是,我想知道,有没有办法优雅地处理它。
到目前为止,我设法在退出之前使用<body onunload="function();"> 检测到它。我想知道是否可以阻止它加载 iframe 或强制它在新窗口中打开等。
干杯, 米奇
【问题讨论】:
标签: javascript jquery iframe
事实上,你可以做你真正想做的事,也就是bust the iframe buster。该技术使您可以使用 onbeforeunload 将页面切换回您的页面,但这是间接的,因为浏览器太聪明了,无法让您在 onbeforeunload 中设置 URL。因此,onbeforeunload 设置一个指示变量来标记 URL 已更改,并且您使用页面加载时建立的 setInterval 例程定期轮询该变量。只要您的轮询速度足够快以捕获变量更改,您就可以自行跳转并更改页面的 URL。诀窍是将其更改为返回 204 的页面,这是一种告诉浏览器不理会当前页面的特殊状态。
也就是说,这是一场猫捉老鼠的游戏。查看Jeff Attwood's StackOverflow question on this,他在那里询问如何破坏上述技术。网页可以通过击败轮询间隔来破坏破坏者破坏者;基本上,他们将 URL 设置为指向一个小页面,并且该页面已经被缓存。一旦 URL 更改到该页面,它的加载速度将超过轮询例程可以跳转并注意到指示符变量已更改的速度。
首先要防止加载框架并不容易。如果你真的想要,你可以让你的服务器下载页面并解析 Javascript 以查看是否存在 iframe-busting 技术。但是,除了模拟浏览器之外,您只能依赖基本的模式匹配,并且页面很容易绕过它。 (例如,使用 top["l"+"ocation"] 代替 top.location)。
一种更智能的技术是跟踪使用 Ajax 请求将哪些 URL 重定向回服务器。 (例如,如果 iframe 在加载后仍然存在,则将 Ajax 请求发送回您的服务器)。您无法 100% 保证这些请求的准确性,因为它们来自浏览器,但您至少可以使用它们来建立手动黑名单。
您也不能强制 iframe 进入另一个窗口。
【讨论】:
您可以使用 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>
【讨论】:
您说的是嵌入式 iframe 设置 top.location 吗?据我所知,没有办法防止这种情况发生。
如果您担心 iframe 的内容会做一些您不想要的事情,您可以考虑清理该框架的内容并自己托管它。显然这是非常棘手的,但它几乎是唯一真正的解决方案。有关执行此操作的项目,请参阅 Caja。这当然会限制您实际托管的内容(例如,如果您托管的代码使用 XHR,那么您就不走运了)。
【讨论】: