【发布时间】:2010-10-31 20:01:33
【问题描述】:
假设您不希望其他网站在<iframe> 中“框定”您的网站:
<iframe src="http://example.org"></iframe>
因此,您在所有页面中插入反框架、破坏框架的 JavaScript:
/* break us out of any containing iframes */
if (top != self) { top.location.replace(self.location.href); }
太棒了!现在你自动“破坏”或突破任何包含 iframe 的内容。除了一个小问题。
事实证明,你的框架破坏代码可能会被破坏,as shown here:
<script type="text/javascript">
var prevent_bust = 0
window.onbeforeunload = function() { prevent_bust++ }
setInterval(function() {
if (prevent_bust > 0) {
prevent_bust -= 2
window.top.location = 'http://example.org/page-which-responds-with-204'
}
}, 1)
</script>
此代码执行以下操作:
- 每次浏览器通过
window.onbeforeunload事件处理程序尝试离开当前页面时,都会增加一个计数器 - 通过
setInterval()设置每毫秒触发一次的计时器,如果发现计数器增加,则将当前位置更改为攻击者控制的服务器 - 该服务器提供一个带有 HTTP 状态代码 204 的页面,这不会导致浏览器在任何地方导航
我的问题是——这更像是一个 JavaScript 难题,而不是一个实际的问题——你如何才能打败破坏框架的破坏者?
我有一些想法,但在我的测试中没有任何效果:
- 尝试通过
onbeforeunload = null清除onbeforeunload事件无效 - 添加
alert()停止进程让用户知道它正在发生,但不会以任何方式干扰代码;点击确定让破坏继续正常进行 - 我想不出任何方法来清除
setInterval()计时器
我不是一个 JavaScript 程序员,所以这是我向你提出的挑战:嘿,破坏者,你能破坏框架破坏破坏者吗?
【问题讨论】:
-
我不确定 frame-buster-buster 是否真的有效......当我尝试测试它时(重定向到我设置为返回 204 的处理程序),它会阻止我导航 页面外的任何地方 - 包括在地址栏中输入内容!我必须关闭浏览器选项卡并打开一个新选项卡才能到达任何地方。所以换句话说,我不确定这需要一个解决方案,因为想要被破坏的框架破坏者是......从一开始就破坏了。 :) (或者我搞砸了我的测试,这永远不会发生......);)
-
Matt,上面发布的 frame-buster-buster 代码肯定有效。一个.. 呃.. 我的朋友.. 告诉我.. 关于它。或者其他的东西。 :)
-
Jeff,您是否在同一个域中使用两个窗口进行测试?看起来你是因为如果你不是,那么安全限制会阻止你修改'onBeforeUnload'
-
附带说明:发布示例时,请使用 RFC 2606 ietf.org/rfc/rfc2606.txt 中指定的
example.org等域 -
关于反反对策的总主题:galactanet.com/comic/view.php?strip=209
标签: javascript html iframe framebusting