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

端木钰浩 阅读 56

我最近在项目里加了点击劫持防护,用了常见的 Framebuster 脚本,但测试发现 Safari 和部分移动端浏览器里还是能被嵌入 iframe,根本拦不住。是不是写法有问题?

我试过下面这段代码,逻辑看起来没问题啊:

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

但有时候页面会卡在跳转循环里,或者干脆没反应。现在有点懵,到底该怎么正确防点击劫持?

我来解答 赞 8 收藏
二维码
手机扫码查看
2 条解答
宇文桂香
Framebuster 代码在某些浏览器里失效可能是由于浏览器的安全策略或者执行时机的问题。你那段代码逻辑没错,但有时候会陷入跳转循环或者无效,可能是因为浏览器的干预。

试试这个改进版的代码,增加了一些判断条件来避免无限循环:

if (window.top !== window.self) {
try {
if (document.referrer.indexOf(window.location.host) === -1) {
window.top.location = window.self.location.href;
}
} catch (e) {
window.self.location = window.self.location.href;
}
}


代码放这了,试试看。注意这个方法也不是万能的,现代浏览器的安全措施越来越强了,可能还需要配合其他防护手段,比如 Content Security Policy (CSP) 的 frame-ancestors 指令。
点赞
2026-03-24 15:12
紫瑶 Dev
问题在于跨域时报错导致代码不执行,加上 try-catch 就行:

if (window.top !== window.self) {
try {
window.top.location.replace(window.self.location);
} catch (e) {
window.top.location.href = window.self.location;
}
}


另外,浏览器安全策略这事儿靠 JS 代码本身就不够靠谱,生产环境务必配合后端设置 X-Frame-Options: DENYContent-Security-Policy: frame-ancestors 一起用。
点赞
2026-03-10 18:02