课程笔记:点击劫持防护方案
课程名称:计算机网络应用 核心摘要:本讲承接上一讲"点击劫持攻击原理",系统讲解点击劫持的两种实现方式(透明 IFRAME 覆盖、图片覆盖)及其对应防护方案。重点掌握
X-Frame-Options响应头的三个取值与 Nginx 全局配置,以及针对图片覆盖攻击的 HTML 代码校验思路。
一、 核心概念与原理
- 点击劫持(Clickjacking):一种基于 UI 覆盖的攻击手法。攻击者将诱导性网页置于底层,再在其上覆盖一个透明
<iframe>(或图片),使用户误以为点击的是可见元素,实则触发了被覆盖层中的按钮,在不知情下完成敏感操作(如加关注、转账等)。 - 攻击本质:只要能实现 UI 覆盖,即可构成点击劫持,不局限于 iframe。
- 生效前提:覆盖层与被覆盖层的关键按钮需 位置重叠,才能保证用户点击点落到隐藏按钮上。
- 两种攻击方式:
- 透明 IFRAME 覆盖:用透明
<iframe>覆盖在正常网页之上,诱导用户操作。 - 图片覆盖攻击:使用一张或多张图片,通过
style控制 CSS 将图片覆盖到原网页上,形成点击劫持;图片本身可能带歧义信息,甚至无需点击即可达到欺骗目的。
- 透明 IFRAME 覆盖:用透明
二、 技术细节与协议分析
1. IFRAME 覆盖攻击的加载来源限制
- 被嵌入的
<iframe>必然指向 攻击者自己的应用(如本机页面localhost中通过 iframe 加载外部站点源)。 - 防御思路:限制页面被外部站点以 iframe 形式加载,从源头切断嵌入。
2. X-Frame-Options 响应头
- 该响应头 专为解决 Clickjacking 而生,通过响应头告知浏览器当前页面是否允许被
<frame>/<iframe>嵌入。 - 三个可选值对比:
| 取值 | 含义 | 适用场景 |
|---|---|---|
DENY | 拒绝当前页面被任何 frame 加载(页面中根本不允许出现 frame 嵌入本页) | 安全性要求最高,页面无需被任何站点嵌套 |
SAMEORIGIN | 只允许 同源 页面加载本页面 | 最常用,适合同源系统内部嵌套 |
ALLOW-FROM <origin> | 允许从指定的来源(origin)加载 | 需要精确授权特定可信站点(部分浏览器已废弃,推荐使用 CSP frame-ancestors) |
生产建议:通常选择
SAMEORIGIN即可满足绝大多数场景。
3. 图片覆盖攻击防护要点
- 图片覆盖本质与 iframe 覆盖一致,区别在于覆盖元素是
<img>。 - 防护重点:检查用户提交的 HTML 代码,重点校验
<img>标签的style属性 是否存在可能导致覆盖(如position:absolute、z-index、opacity等)的可疑样式。 - 该方式无法通过响应头全局拦截,需 编写校验代码 做具体控制。
三、 实践应用与配置命令
Nginx 全局配置 X-Frame-Options(推荐做法)
# 在 Nginx 配置中为所有响应添加 X-Frame-Options 响应头
# add_header 语法:add_header 响应头名 值;
# 方案一:完全禁止被嵌套(最严格)
add_header X-Frame-Options DENY;
# 方案二:仅允许同源嵌套(生产推荐)
add_header X-Frame-Options SAMEORIGIN;
# 方案三:允许指定来源嵌套(语法示例,浏览器兼容性较差)
add_header X-Frame-Options "ALLOW-FROM https://trusted.example.com";
# 完整 server 配置片段示例
server {
listen 80;
server_name example.com;
# 对所有请求统一添加同源限制响应头
add_header X-Frame-Options SAMEORIGIN;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
图片覆盖攻击防护伪代码
// 校验用户提交 HTML 中 <img> 的 style 属性,拦截可能导致覆盖的危险样式
function sanitizeImgStyle(html) {
// 解析 HTML,提取所有 <img> 标签的 style 属性
// 检测危险 CSS 关键字:position:absolute/fixed、z-index、opacity:0、display 覆盖等
// 命中则过滤或拒绝提交
}
四、 重点与难点提示
- 考点 1:
X-Frame-Options的三个取值及含义(DENY/SAMEORIGIN/ALLOW-FROM),是面试与考试高频题。 - 考点 2:点击劫持的两种实现方式——透明 IFRAME 覆盖 与 图片覆盖,两者本质都是 UI 覆盖。
- 易错点 1:
ALLOW-FROM在现代浏览器(Chrome、Edge 等)中已不被支持,现代方案应使用 CSP 的frame-ancestors指令 替代。 - 易错点 2:
X-Frame-Options只能防护 iframe/frame 嵌入类覆盖,无法防护图片覆盖攻击,图片覆盖必须通过校验用户提交的 HTML 代码(重点是<img>的style属性)来解决。 - 易错点 3:
add_header在 Nginx 中若同 location 已存在add_header,会覆盖而非追加,注意配置层级。 - 对比理解:点击劫持 vs XSS vs CSRF
- XSS:注入并执行恶意脚本;
- CSRF:借用用户身份发起跨站请求;
- Clickjacking:通过 UI 覆盖诱导用户在不知情下操作。
- 认知误区:点击劫持因"需要诱导"且实施成本相对较高,常被开发人员忽视,重视程度远低于 XSS、CSRF,但仍是必须防御的安全风险。
五、 课后疑问/遗留问题
X-Frame-Options已逐步被 CSPframe-ancestors取代,后续课程是否会详细讲解Content-Security-Policy的完整指令体系?- 针对
ALLOW-FROM的浏览器兼容性问题,旧系统兼容方案应如何设计? - 图片覆盖攻击的 HTML 校验,是否有成熟的开源库(如 DOMPurify)可直接集成?后续课程是否会介绍具体实现?
- 现代前端框架(Vue/React)中是否天然具备一定的点击劫持防护能力?需结合后续框架安全章节确认。