Frame Busting 代码为啥在某些浏览器里失效了?

宇文慧慧 阅读 4

我最近在做前端安全加固,加了防点击劫持的 Frame Busting 代码,但测试发现 Chrome 和 Safari 下有时候还是能被嵌入 iframe,是我写法有问题吗?

我试过用 top.location 替换,也加了 CSP 头,但本地测试时下面这段代码在某些情况下好像没起作用:

<script type="text/javascript">
  if (top !== self) {
    top.location = self.location;
  }
</script>
我来解答 赞 1 收藏
二维码
手机扫码查看
1 条解答
秀丽(打工版)
啊这个坑我踩过!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