点击劫持Self检测为啥没生效? Designer°一诺 提问于 2026-03-02 09:37:18 阅读 25 安全 我按照网上教程加了点击劫持的Self检测,但嵌套在iframe里还是能正常加载,根本没被拦截。是我写法有问题吗? 我试过在页面顶部加这段CSS: body { display: block !important; } body:has(iframe) { display: none !important; } 但好像完全没用,iframe照样显示内容。是不是这个方案本身就有问题?还是浏览器不支持? Self检测 我来解答 赞 16 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 UX-付娟 Lv1 你这方案确实有问题,CSS的:has选择器虽然很酷但兼容性很差,而且防点击劫持本来就不该用CSS来做。 正经方案是用HTTP响应头,简单粗暴有效: // 服务端设置这个响应头(以PHP为例) header('X-Frame-Options: SAMEORIGIN'); // 更现代的替代方案(推荐) header('Content-Security-Policy: frame-ancestors 'self''); 如果非要前端解决(不推荐),可以这样优化你的JS检测: if (window.self !== window.top) { document.body.innerHTML = '拒绝嵌套访问'; document.body.style.display = 'block'; } 吐槽下,现在都2023年了还有人用CSS防劫持...这就像用卫生纸当防盗门。赶紧上CSP头吧,这才是正道。 回复 点赞 1 2026-03-07 22:09 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,更可靠。 回复 点赞 3 2026-03-02 10:05 加载更多 相关推荐 2 回答 101 浏览 Vue的Self检测在iframe里总是返回false怎么办? 在Vue组件里嵌入第三方iframe时,按照文档写了Self检测逻辑,但点击完全没反应,Self检测好像没生效,哪里出问题了? 我的组件结构是这样的,用iframe引用了支付页面: <templ... 闲人春彦 安全 2026-02-04 20:07:26 1 回答 45 浏览 点击劫持防护中如何正确检测页面是否被嵌入iframe? 我在做点击劫持防护,看到可以用 top !== self 来判断是否被嵌套,但实际测试时发现有些情况下这个判断不生效,比如在同域 iframe 里。我试了下面这段代码,但好像还是会被绕过? <s... 萌新.辽源 安全 2026-03-18 21:40:21 1 回答 38 浏览 点击劫持防护中 top 检测为啥失效了? 我在做点击劫持防护,按照网上教程加了 top !== self 的判断,但嵌套在 iframe 里还是能正常加载,没被拦截,这是为啥? 我试过在页面最顶部加这段脚本,也确认没被其他逻辑绕过,但就是不生... 书生シ芸硕 安全 2026-03-01 17:45:19 1 回答 24 浏览 点击劫持Self检测为啥不生效? 我在页面里加了X-Frame-Options: SAMEORIGIN,但用iframe嵌套自己域名的页面还是被拦了,这不应该是允许的吗? 试过在Nginx里配:add_header X-Frame-O... ___爱欢 安全 2026-03-01 12:55:19 1 回答 38 浏览 点击劫持防护中 top 检测为啥失效了? 我按照网上教程加了点击劫持的 top 检测逻辑,但嵌入 iframe 后页面还是能正常加载,没被跳出去。是我写法有问题吗? 试过在 Chrome 里用本地文件打开测试,也试过部署到服务器上,结果都一样... ❤明明 安全 2026-03-30 08:59:12 1 回答 48 浏览 透明遮罩防点击劫持为啥没生效? 我在页面里加了个透明遮罩防止点击劫持,但好像没啥用,别人还是能嵌到 iframe 里点按钮。是不是我写法有问题? 试过在 body 上盖一层全屏 div,z-index 设得很高,但实际测试时发现点击... ___倩利 安全 2026-03-21 19:33:21 2 回答 52 浏览 React组件如何检测自身是否被嵌入iframe防止点击劫持? 我在开发一个React仪表盘组件时遇到点击劫持问题,第三方页面用iframe嵌入我的组件后完全覆盖透明层实施攻击。我尝试在组件中添加: componentDidMount() { if (window... ♫希玲 安全 2026-02-02 18:39:29 1 回答 31 浏览 点击劫持防护中如何正确实现用户交互确认? 我在做安全加固时,想防止点击劫持,听说需要用户主动交互才能执行敏感操作。但我试了下,在 React 里加了个确认弹窗,结果还是被测试工具绕过了,是不是我理解错了? 比如下面这个删除按钮,点完还要 co... 婷婷 安全 2026-03-15 21:18:20 1 回答 59 浏览 前端如何防范点击劫持中的 Strokejacking 攻击? 最近在做项目安全审计,听说了一种叫 Strokejacking 的点击劫持变种,说是攻击者通过透明覆盖层诱导用户在不知情下触发操作。我试着加了 X-Frame-Options 和 CSP 的 fram... Des.梦雅 安全 2026-03-14 20:14:22 2 回答 49 浏览 React 项目如何防止被嵌入 iframe 导致点击劫持? 我最近在做公司后台系统,用的是 React,担心被人用 iframe 嵌套我们的页面搞点击劫持。听说可以通过设置 X-Frame-Options 或 Content-Security-Policy 来... IT人爱静 安全 2026-03-13 19:28:20
:has选择器虽然很酷但兼容性很差,而且防点击劫持本来就不该用CSS来做。正经方案是用HTTP响应头,简单粗暴有效:
如果非要前端解决(不推荐),可以这样优化你的JS检测:
吐槽下,现在都2023年了还有人用CSS防劫持...这就像用卫生纸当防盗门。赶紧上CSP头吧,这才是正道。
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,更可靠。