如何防止我的页面被其他网站通过iframe嵌套导致点击劫持?

晨羲~ 阅读 58

我在做一个登录页面时,用X-Frame-Options: DENY和JavaScript防嵌套代码:

if (self !== top) { top.location = self.location; }

但测试时发现,攻击者通过修改allow-top-navigation-by-user-activation等策略,还是能绕过我的防御,这是为什么?具体该怎么堵住漏洞?

我来解答 赞 11 收藏
二维码
手机扫码查看
2 条解答
UX明明
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-素玲
你提到的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