点击劫持(Clickjacking)
点击劫持通过视觉欺骗引导用户点击隐藏内容,达到冒充操作、窃取信息、传播恶意链接的目的。随着业务日益复杂(支付、金融、后台操作、AI 提交等),防护更需结合安全头、内容隔离与交互验证。
攻击原理
- 攻击者构造网页,将目标站点通过
<iframe>
、opacity
、z-index
等方式覆盖在透明层下方。 - 用户以为自己在点击无害按钮,实际触发目标站点上的敏感操作(转账、授权、点赞)。
- 变种包括:Cursorjacking(隐藏鼠标位置)、Touchjacking(移动端触摸诱导)、Likejacking(社交平台点赞)。
防护手段
1. X-Frame-Options
DENY
:拒绝所有嵌套。SAMEORIGIN
:仅允许同源页面嵌入。ALLOW-FROM uri
:允许指定来源(已被 CSP 取代,不再推荐)。
X-Frame-Options: SAMEORIGIN
http
2. Content-Security-Policy frame-ancestors
更灵活的现代方案,支持多个来源、子域名、协议限制。
Content-Security-Policy: frame-ancestors 'self' https://trusted.partner.com;
http
- 优先使用 CSP;对旧版浏览器可同时设置
X-Frame-Options
兼容。
3. UI 防护
- 关键操作需要用户确认(验证码、二次弹窗、滑动确认)。
- 将按钮在点击时验证鼠标位置是否可见(
elementFromPoint
)。 - 设置最小透明度检测/自动失焦,在检测到页面被嵌入时提示用户。
4. 多因子验证与权限控制
- 对高风险操作启用 OTP、MFA、口令确认。
- 行为分析与风控:判断是否来自可信设备/地区。
5. 前端检测策略
if (window.top !== window.self) {
// 页面被嵌入
document.body.classList.add('is-framed');
// 可选择跳转/遮罩
// window.top.location = window.location;
}
js
注意:直接
window.top.location = window.location
可能被浏览器阻止,推荐使用提示遮罩 + 用户确认。
6. 与其他漏洞结合的风险
- XSS + 点击劫持:在恶意页面中插入 XSS 脚本,放大危害。
- CSRF + 点击劫持:诱导用户完成包含 Token 的表单提交。
- AI 应用:将 LLM 控制台、管理后台嵌入恶意页面,引导操作。
实践建议
- 默认对所有登录态页面返回
frame-ancestors 'none'
。 - 对需要合法嵌入的页面(如小组件)设计专用域名,并使用 PostMessage 校验来源。
- 后台操作应有终端识别、权限审批、日志审计。
- 与第三方合作嵌入时签订安全协议,定期进行安全测试。
参考资料
- Mozilla Web Security Guidelines - Clickjacking
- OWASP Clickjacking Defense Cheat Sheet
- Google Chrome Security Blog(关于 frame busting 建议)
点击劫持往往与 XSS、CSRF 联合出现。请确保配套防护策略同步更新,构建多层安全防线。
↑