点击劫持Self检测为啥没生效? Designer°一诺 提问于 2026-03-02 09:37:18 阅读 9 安全 我按照网上教程加了点击劫持的Self检测,但嵌套在iframe里还是能正常加载,根本没被拦截。是我写法有问题吗? 我试过在页面顶部加这段CSS: body { display: block !important; } body:has(iframe) { display: none !important; } 但好像完全没用,iframe照样显示内容。是不是这个方案本身就有问题?还是浏览器不支持? Self检测 我来解答 赞 5 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 1 条解答 Mc.光耀 Lv1 你这个CSS检测的逻辑搞反了。 body:has(iframe) 是在找"body里面包含iframe的情况",但你的页面是被嵌套在别人的iframe里,你的body里根本没有iframe,是别人的页面里有iframe装着你的页面。所以这个选择器永远不会命中。 正确的CSS防护思路是:默认隐藏页面,只有检测到不在iframe中才显示。但纯CSS做不到这个检测,必须配合JS。 给你一个优雅的写法: 先在CSS里默认隐藏: html { display: none; } 然后在head里加这段JS,要放在最前面: if (self === top) { document.documentElement.style.display = 'block'; } else { top.location = self.location; } 原理很简单:默认把html藏起来,如果当前窗口就是顶层窗口(没有被嵌套),就显示出来;否则直接跳转到自己的地址,把父框架给顶掉。 不过说实话,现在更推荐用HTTP响应头来防,一劳永逸。配置一下 X-Frame-Options: DENY 或者 Content-Security-Policy: frame-ancestors 'none',服务器层面就拦住了,不依赖前端JS,更可靠。 回复 点赞 1 2026-03-02 10:05 加载更多 相关推荐 2 回答 77 浏览 Vue的Self检测在iframe里总是返回false怎么办? 在Vue组件里嵌入第三方iframe时,按照文档写了Self检测逻辑,但点击完全没反应,Self检测好像没生效,哪里出问题了? 我的组件结构是这样的,用iframe引用了支付页面: <templ... 闲人春彦 安全 2026-02-04 20:07:26 1 回答 9 浏览 点击劫持防护中 top 检测为啥失效了? 我在做点击劫持防护,按照网上教程加了 top !== self 的判断,但嵌套在 iframe 里还是能正常加载,没被拦截,这是为啥? 我试过在页面最顶部加这段脚本,也确认没被其他逻辑绕过,但就是不生... 书生シ芸硕 安全 2026-03-01 17:45:19 1 回答 6 浏览 点击劫持Self检测为啥不生效? 我在页面里加了X-Frame-Options: SAMEORIGIN,但用iframe嵌套自己域名的页面还是被拦了,这不应该是允许的吗? 试过在Nginx里配:add_header X-Frame-O... ___爱欢 安全 2026-03-01 12:55:19 2 回答 36 浏览 React组件如何检测自身是否被嵌入iframe防止点击劫持? 我在开发一个React仪表盘组件时遇到点击劫持问题,第三方页面用iframe嵌入我的组件后完全覆盖透明层实施攻击。我尝试在组件中添加: componentDidMount() { if (window... ♫希玲 安全 2026-02-02 18:39:29 1 回答 20 浏览 点击劫持防护怎么加才有效? 我在做公司后台系统,听说要防点击劫持,就试着在 HTML 里加了 X-Frame-Options: DENY,但好像没生效?页面还是能被别人用 iframe 嵌套。 后来查资料说要用 Content-... IT人剑博 前端 2026-02-28 20:29:20 2 回答 35 浏览 Sandbox属性能防点击劫持吗?为什么加了还是被嵌入iframe? 我最近在做安全加固,听说用 iframe 的 sandbox 属性可以防止点击劫持,就在我们 React 项目的主页面加了 allow-same-origin 和 allow-scripts,但测试时... Code°慧红 安全 2026-02-28 04:51:19 2 回答 10 浏览 Framebuster 防点击劫持代码为啥在某些浏览器里失效了? 我最近在项目里加了个防点击劫持的 Framebuster 脚本,但测试时发现 Chrome 和 Firefox 表现不一致——有时候页面还是能被嵌入 iframe。我明明写了判断 top 是否等于 s... 爱欢 Dev 安全 2026-02-24 18:18:20 2 回答 33 浏览 如何防止嵌套页面被点击劫持?X-Frame-Options和CSP设置无效? 最近在开发仪表盘页面时,发现嵌套的表单页面被恶意网站用iframe嵌入,导致用户误操作点击劫持。我尝试在服务器配置中设置了X-Frame-Options: SAMEORIGIN,并在CSP头里写了: ... 开发者世杰 安全 2026-02-10 00:58:31 2 回答 37 浏览 为什么设置script-src后页面脚本无法运行? 我在页面里写了个简单的按钮点击弹窗功能,配置CSP后突然失效了。设置了script-src只允许'self'和一个nonce,但控制台报错说阻止了内联脚本执行。代码明明加了nonce属性啊,哪里出问题... 敏涵 Dev 安全 2026-02-01 17:26:30 2 回答 83 浏览 如何防止攻击者绕过我的Top窗口检测防御? 我在页面加了if (top !== self) top.location=self;想防点击劫持,但测试时发现攻击者用透明iframe叠加后检测失效了。明明设置了X-Frame-Options: SA... 利利(打工版) 安全 2026-01-30 15:22:35
body:has(iframe)是在找"body里面包含iframe的情况",但你的页面是被嵌套在别人的iframe里,你的body里根本没有iframe,是别人的页面里有iframe装着你的页面。所以这个选择器永远不会命中。正确的CSS防护思路是:默认隐藏页面,只有检测到不在iframe中才显示。但纯CSS做不到这个检测,必须配合JS。
给你一个优雅的写法:
先在CSS里默认隐藏:
然后在head里加这段JS,要放在最前面:
原理很简单:默认把html藏起来,如果当前窗口就是顶层窗口(没有被嵌套),就显示出来;否则直接跳转到自己的地址,把父框架给顶掉。
不过说实话,现在更推荐用HTTP响应头来防,一劳永逸。配置一下
X-Frame-Options: DENY或者Content-Security-Policy: frame-ancestors 'none',服务器层面就拦住了,不依赖前端JS,更可靠。