点击劫持在防什么
点击劫持的原理是页面被透明的 iframe 覆盖,用户以为自己在点别处,实际点的是目标页面上的按钮。防护手段是两种响应头:X-Frame-Options(DENY 或 SAMEORIGIN)与 CSP 的 frame-ancestors 指令。检查重点在覆盖面:首页配了不代表登录页和支付页也配了,而这两个页面才是真正的目标。验证方式既可以是抓响应头,也可以自建一个页面尝试嵌入目标。
基本信息
| 响应头 | X-Frame-Options: DENY 或 SAMEORIGIN |
|---|---|
| CSP 指令 | frame-ancestors 'none' 或 'self' |
| 验证方式 | 抓取响应头 + 自建 HTML 尝试 iframe 嵌入 |
| 重点页面 | 登录页、支付与转账页、授权确认页、管理后台 |
| 浏览器差异 | 现代浏览器中 frame-ancestors 优先,旧版 IE 只认 X-Frame-Options |
典型使用场景
- Web 安全基线核查的常规项
- 评估敏感操作页是否可被嵌入(登录、支付、授权)
- 排查「页面上有未知 iframe」这类现象的反向风险
- 为跨站脚本类问题提供纵深防御建议
- 修复验证:确认响应头在全部敏感页面生效
检查步骤
检查步骤
# 1. 抓响应头,确认两种防护是否存在
curl -sI https://example.com/login | grep -Ei 'x-frame-options|content-security-policy'
# Windows PowerShell 可用 curl.exe 或 Invoke-WebRequest 的 Headers 属性
# 2. 无防护头时,自建页面在授权范围内验证嵌入(本地文件即可)
# 自建页面内容示例:<iframe src="https://example.com/login"></iframe>
# 3. 记录:页面 + 防护头现状 + 是否可嵌入防护现状与判断
| 现状 | 含义 | 处置 |
|---|---|---|
| 两项都缺失 | 可被任意站点嵌入 | 列缺陷,建议全站统一策略 |
| 仅 X-Frame-Options: SAMEORIGIN | 同源可嵌入 | 基本满足要求,可补充 frame-ancestors |
| CSP frame-ancestors 'none' | 完全禁止嵌入 | 记录为良好实践 |
| 仅首页有防护 | 敏感页面可能仍可嵌入 | 逐个敏感页面核查后再下结论 |
修复视角:全站统一配置 frame-ancestors 策略;注意该指令在旧版浏览器不受支持,需要与 X-Frame-Options 并存以覆盖历史客户端。
注意 CSP 与 X-Frame-Options 并存时的行为差异:现代浏览器以 frame-ancestors 为准,两条策略互相矛盾时实际生效的是前者。