如何防止我的页面被其他网站通过iframe嵌套导致点击劫持? 晨羲~ 提问于 2026-02-03 16:05:35 阅读 58 安全 我在做一个登录页面时,用X-Frame-Options: DENY和JavaScript防嵌套代码: if (self !== top) { top.location = self.location; } 但测试时发现,攻击者通过修改allow-top-navigation-by-user-activation等策略,还是能绕过我的防御,这是为什么?具体该怎么堵住漏洞? 点击劫持 我来解答 赞 11 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 UX明明 Lv1 你遇到的这个问题其实挺典型的,X-Frame-Options 只能防住普通 iframe 嵌套,但像 allow-top-navigation-by-user-activation 这种策略是 HTML5 的新特性,它允许嵌入页在用户交互后跳转顶层窗口,这时候 JS 的 self !== top 检查就失效了——因为页面确实被嵌套了,但用户一点击按钮,它就能把整个浏览器顶出去跳转到你的登录页,用户根本不知道自己点进了个 iframe。 首先明确一点:X-Frame-Options 已经被 CSP 的 frame-ancestors 指令替代了,建议直接上 Content-Security-Policy,比如: Content-Security-Policy: frame-ancestors 'none' 或者只允许同源嵌套就写成: Content-Security-Policy: frame-ancestors 'self' 注意,frame-ancestors 的优先级比 X-Frame-Options 高,如果两者都设了,浏览器会优先用 CSP 的。 另外 JS 的防嵌套方案不能全信,它只能在页面加载后执行,中间有时间窗口,攻击者可以先让 iframe 加载,等 JS 跳转还没执行完就触发点击劫持。所以 JS 防嵌套只能当兜底,不能当主力。 还有一点很多人忽略:别忘了给页面加 X-XSS-Protection 和 Referrer-Policy,虽然不直接防 iframe,但能减少组合攻击面。 最后提醒一句,如果你的登录页是给第三方集成用的(比如 OAuth 登录),那可能得允许特定域名嵌套,这时候 CSP 就写成: Content-Security-Policy: frame-ancestors https://trusted-site.com https://another-trusted.com; 别手贱加 *,当年 GitHub 就这么栽过。 总结:CSP 的 frame-ancestors 是核心防线,JS 防嵌套只做最后一道补丁,别指望靠它挡攻击。 回复 点赞 5 2026-02-25 19:05 FSD-素玲 Lv1 你提到的X-Frame-Options和JavaScript防嵌套手段是常见的防御点击劫持的方式,但它们确实存在一些兼容性和绕过问题,特别是在现代浏览器中引入了新的iframe策略如allow-top-navigation-by-user-activation等特性后。 X-Frame-Options是旧标准,已经被Content-Security-Policy(CSP)中的frame-ancestors策略取代。建议你改用CSP来增强防御,例如: Content-Security-Policy: frame-ancestors 'none'; 如果你需要兼容旧浏览器,可以同时保留X-Frame-Options: X-Frame-Options: DENY 另外,JavaScript检测方式虽然有用,但也有局限性,特别是在某些浏览器策略允许嵌套但不完全开放top权限的情况下,这种检测可能失效。建议你只将其作为备用手段,而非主防御。 总结一下完整的防御策略: 1. 使用Content-Security-Policy的frame-ancestors设置为'none',防止页面被嵌套; 2. 兼容旧浏览器时设置X-Frame-Options为DENY; 3. 可选添加JavaScript检测作为补充(但不能单独依赖); 4. 注意CSP的Report-Only模式可以先观察影响再全面启用。 这样基本可以堵住大部分iframe嵌套导致的点击劫持漏洞。 回复 点赞 14 2026-02-03 16:06 加载更多 相关推荐
首先明确一点:X-Frame-Options 已经被 CSP 的 frame-ancestors 指令替代了,建议直接上 Content-Security-Policy,比如:
Content-Security-Policy: frame-ancestors 'none'或者只允许同源嵌套就写成:
Content-Security-Policy: frame-ancestors 'self'注意,frame-ancestors 的优先级比 X-Frame-Options 高,如果两者都设了,浏览器会优先用 CSP 的。
另外 JS 的防嵌套方案不能全信,它只能在页面加载后执行,中间有时间窗口,攻击者可以先让 iframe 加载,等 JS 跳转还没执行完就触发点击劫持。所以 JS 防嵌套只能当兜底,不能当主力。
还有一点很多人忽略:别忘了给页面加 X-XSS-Protection 和 Referrer-Policy,虽然不直接防 iframe,但能减少组合攻击面。
最后提醒一句,如果你的登录页是给第三方集成用的(比如 OAuth 登录),那可能得允许特定域名嵌套,这时候 CSP 就写成:
Content-Security-Policy: frame-ancestors https://trusted-site.com https://another-trusted.com;别手贱加 *,当年 GitHub 就这么栽过。
总结:CSP 的 frame-ancestors 是核心防线,JS 防嵌套只做最后一道补丁,别指望靠它挡攻击。
X-Frame-Options是旧标准,已经被Content-Security-Policy(CSP)中的frame-ancestors策略取代。建议你改用CSP来增强防御,例如:
如果你需要兼容旧浏览器,可以同时保留X-Frame-Options:
另外,JavaScript检测方式虽然有用,但也有局限性,特别是在某些浏览器策略允许嵌套但不完全开放top权限的情况下,这种检测可能失效。建议你只将其作为备用手段,而非主防御。
总结一下完整的防御策略:
1. 使用Content-Security-Policy的frame-ancestors设置为
'none',防止页面被嵌套;2. 兼容旧浏览器时设置X-Frame-Options为DENY;
3. 可选添加JavaScript检测作为补充(但不能单独依赖);
4. 注意CSP的Report-Only模式可以先观察影响再全面启用。
这样基本可以堵住大部分iframe嵌套导致的点击劫持漏洞。