点击劫持 Click Jacking

防御 Click Jacking

frame busting

通常可以写一段 JavaScript 代码,以禁止 iframe 的嵌套。这种方法叫做 frame busting。比如:

1
if (top.location != location) top.location = self.location

但是这种方法也存在一些缺陷,因为它是用 JavaScript 写的,控制能力并不是特别强,因此有许多方法可以绕过它。比如上面的方法就可以用嵌套多个 iframe 的方法绕过:

1
2
3
4
5
6
7
Attacker top frame:
# 自学笔记 (pdf)

<iframe src="attacker2.html">
    Attacker sub-frame:
    <iframe src="http://victim.com"></iframe>
</iframe>

X-Frame-Options

因为 frame busting 存在被绕过的可能,所以我们需要更好的方法。一个比较好的方案是使用一个 HTTP 请求头——X-Frame-Options,这个请求头可以说是为了解决 Click Jacking 而生的。

  • 当这个值为 DENY 时,浏览器会拒绝当前页面加载任何 frame 页面;

  • 若值为 SAMEORIGIN 时,则可以定义允许 frame 加载的页面地址。