Frame Busting 代码为啥在某些浏览器里失效了? 宇文慧慧 提问于 2026-03-09 22:52:22 阅读 4 安全 我最近在做前端安全加固,加了防点击劫持的 Frame Busting 代码,但测试发现 Chrome 和 Safari 下有时候还是能被嵌入 iframe,是我写法有问题吗? 我试过用 top.location 替换,也加了 CSP 头,但本地测试时下面这段代码在某些情况下好像没起作用: <script type="text/javascript"> if (top !== self) { top.location = self.location; } </script> 点击劫持 我来解答 赞 1 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 1 条解答 秀丽(打工版) Lv1 啊这个坑我踩过!Frame Busting确实不是百分百可靠的,主要是有几种情况会让它失效: 1. 有些浏览器实现了X-Frame-Options或Content-Security-Policy之后,会故意禁用frame busting脚本(特别是Chrome) 2. 攻击者可以用sandbox属性来阻止脚本执行,比如<iframe sandbox="allow-forms"> 可以试试这样改进你的方案: 首先在HTTP头里加上X-Frame-Options(这个优先级最高): X-Frame-Options: DENY # 或者 X-Frame-Options: SAMEORIGIN 然后你的JS代码可以改成更健壮的版本: if (top !== self) { try { top.location = self.location; } catch(e) { document.body.innerHTML = '不允许在iframe中加载'; document.body.style.cssText = 'font-size:30px;color:red;text-align:center;'; window.stop(); } } 另外提醒下,现在更推荐用CSP的frame-ancestors指令: Content-Security-Policy: frame-ancestors 'none' 说实话现在的浏览器安全策略变化太快,我上周测试时还发现Edge对某些配置的处理方式又不一样了...建议三个方案都用上,反正不冲突。 回复 点赞 2026-03-09 23:03 加载更多 相关推荐
1. 有些浏览器实现了X-Frame-Options或Content-Security-Policy之后,会故意禁用frame busting脚本(特别是Chrome)
2. 攻击者可以用sandbox属性来阻止脚本执行,比如
<iframe sandbox="allow-forms">可以试试这样改进你的方案:
首先在HTTP头里加上X-Frame-Options(这个优先级最高):
然后你的JS代码可以改成更健壮的版本:
另外提醒下,现在更推荐用CSP的frame-ancestors指令:
说实话现在的浏览器安全策略变化太快,我上周测试时还发现Edge对某些配置的处理方式又不一样了...建议三个方案都用上,反正不冲突。