如何防止攻击者绕过我的Top窗口检测防御?

利利(打工版) 阅读 78

我在页面加了if (top !== self) top.location=self;想防点击劫持,但测试时发现攻击者用透明iframe叠加后检测失效了。明明设置了X-Frame-Options: SAMEORIGIN,为什么还能被绕过?

尝试过这个检测函数:


if (window.top !== window.self) {
  alert('被嵌入了!');
  window.top.location.href = window.location.href;
}

但攻击者用下面的代码居然能绕过去:



明明设置了HTTP头X-Frame-Options: SAMEORIGIN,为什么还能被跨域嵌入?是不是应该用CSP来增强防护?

我来解答 赞 8 收藏
二维码
手机扫码查看
2 条解答
❤丹丹
❤丹丹 Lv1
X-Frame-Options 在现代浏览器中已被 CSP 的 frame-ancestors 指令取代,有些浏览器或环境会忽略它。最简单的办法是直接上 Content-Security-Policy。

Content-Security-Policy: frame-ancestors 'self';


这会阻止页面被任何非同源页面嵌套,连 JS 都不用写,一劳永逸。
点赞 4
2026-02-10 16:11
雅茹 ☘︎
你这个防护确实有点弱,攻击者用透明iframe叠加确实能绕过。X-Frame-Options: SAMEORIGIN虽然限制了同域嵌套,但对一些复杂的攻击场景还是不够。

建议你直接上CSP(Content-Security-Policy),这是目前最靠谱的防御方式。具体配置如下:

<meta http-equiv="Content-Security-Policy" content="frame-ancestors 'self';">


或者在HTTP头里加:

Content-Security-Policy: frame-ancestors 'self';


这样可以彻底禁止其他域名嵌套你的页面。如果还需要兼容子域名,可以用下面这个:

Content-Security-Policy: frame-ancestors 'self' *.yourdomain.com;


拿去改改,基本就能防住这种攻击了。当然,JS检测还是可以保留作为双重防护,但主要还是靠CSP。
点赞 3
2026-01-30 22:04