推荐答案
点击劫持 (Clickjacking) 是一种恶意技术,攻击者将目标页面嵌入到一个透明的 iframe 中,覆盖在攻击者精心制作的网页上。用户在攻击者页面上看似点击的操作,实际上是点击了被覆盖的 iframe 中的目标页面,从而在不知情的情况下执行了攻击者预设的操作。
防御方法:
X-Frame-Options
响应头:DENY
:禁止任何页面将当前页面嵌入到 iframe 中。SAMEORIGIN
:只允许同源的页面嵌入当前页面到 iframe 中。ALLOW-FROM uri
:允许指定的 uri 的页面嵌入当前页面到 iframe 中(不推荐,兼容性问题)。
推荐使用
DENY
或SAMEORIGIN
。Content-Security-Policy (CSP)
响应头:- 使用
frame-ancestors
指令来控制哪些来源可以将当前页面嵌入到 iframe 中。 - 例如:
Content-Security-Policy: frame-ancestors 'self';
仅允许同源页面嵌入。
CSP 比
X-Frame-Options
更强大且灵活,推荐使用。- 使用
JavaScript 防御:
- 使用 JavaScript 代码检测当前页面是否在 iframe 中,如果是则跳转到顶层窗口。
- 例如:
if (top !== self) { top.location = self.location; }
。
此方法作为补充方案,不应该作为主要防御手段。
服务端渲染页面加检测:
- 服务端在渲染页面时,增加一些安全相关的检测机制,例如:检查请求头里的
Referer
或Origin
字段,判断请求是否合法。
此方法作为补充方案,不应该作为主要防御手段。
- 服务端在渲染页面时,增加一些安全相关的检测机制,例如:检查请求头里的
本题详细解读
点击劫持是一种 UI 覆盖攻击,核心原理在于利用 HTML 的 <iframe>
标签将目标网页嵌入到恶意网页中,并通过透明化或定位方式覆盖在攻击者精心设计的诱导用户点击的元素之上。 用户在毫不知情的情况下,点击了看似无害的按钮或链接,但实际上触发了隐藏在底层的目标页面的操作。
攻击过程:
- 攻击者创建恶意页面: 攻击者创建一个包含透明
<iframe>
的网页,<iframe>
的src
指向目标网站的页面,并设置透明度为0。 - 覆盖和诱导: 攻击者在
<iframe>
上层放置诱导用户点击的按钮或其他元素,例如“免费领取礼品”等。 - 用户不知情点击: 用户在不知情的情况下点击了攻击者页面上的诱导元素,实际上点击的是隐藏在下方的目标网站的页面元素。
- 执行恶意操作: 用户在目标网站上的操作被执行,例如修改账户设置、发送消息、进行转账等,而用户完全不知情。
防御方法的详细解释:
X-Frame-Options
响应头:X-Frame-Options
是一个 HTTP 响应头,用于指示浏览器是否允许当前页面被嵌入到 iframe 中。DENY
:最为严格,禁止所有页面嵌入,是最安全的设置。SAMEORIGIN
:只允许与当前页面同源的页面嵌入,避免跨域点击劫持。ALLOW-FROM uri
:允许指定uri
的页面嵌入,由于浏览器支持不一致,一般不推荐使用。X-Frame-Options
的缺点:只能设置禁止或同源,无法进行更细粒度的控制。
Content-Security-Policy (CSP)
响应头:CSP
是一种更强大的安全机制,通过frame-ancestors
指令来控制页面可以被哪些来源的页面嵌入。frame-ancestors 'self';
:只允许同源的页面嵌入。frame-ancestors 'self' https://example.com;
:允许同源页面和https://example.com
嵌入。CSP
提供更加灵活的配置选项,建议使用。
JavaScript 防御:
- 通过
top
和self
对象的比较,可以检测当前页面是否处于 iframe 中。 - 如果
top !== self
,表示当前页面位于 iframe 中,可以通过top.location = self.location;
跳转到顶层窗口,从而打破 iframe 劫持。 - 这种方法依赖于 JavaScript 的执行,如果攻击者禁用 JavaScript 或者利用浏览器漏洞,该方法可能会失效,所以只能作为辅助防御手段。
- 通过
服务端渲染页面加检测:
- 服务器端可以在响应请求时,检查
Referer
或者Origin
等请求头字段。 Referer
用于指示当前请求的来源页面,Origin
用于指示请求的来源域名,根据这些字段可以判断请求是否来自于非法的页面。- 此种方法也有缺点,
Referer
可能被篡改或丢失,并且依赖于服务端代码实现,增加了额外的开发负担,所以只能作为辅助防御手段。
- 服务器端可以在响应请求时,检查
总而言之,防止点击劫持的最有效方法是使用 X-Frame-Options
或者 CSP
响应头,其中推荐使用 CSP
,JavaScript 防御和服务器端检测作为补充防御手段。