一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

强化动态属性安全性:防止点击劫持的HTML代码质量审查

时间:2026-07-08 12:57:46 编辑:袖梨 来源:一聚教程网

最直接确认页面是否被 iframe 嵌套的方法是早期执行 window.top !== window.self 判断并立即跳转,而非依赖 referrer 或 DOMContentLoaded 后检测。

怎么确认页面是否正在被 iframe 嵌套

最直接的办法是运行一段检测脚本,而不是等攻击发生后再补救。关键不是“有没有 iframe”,而是“当前页面是否处于 window.top !== window.self 状态”。这个判断必须在 DOM 加载早期执行,否则可能被后续脚本覆盖或绕过。

常见错误现象:把检测逻辑放在 DOMContentLoaded 之后,或包裹在第三方库初始化回调里——此时攻击者早已完成透明层覆盖;更糟的是只检查 parent !== window,漏掉嵌套在多层 iframe 中的场景。

  • 必须用 window.top !== window.self,它能穿透任意深度嵌套
  • 检测后立即跳转(window.top.location = window.location)比仅提示用户更可靠
  • 不要依赖 document.referrer 判断来源,它可被伪造
  • 若页面需被自家子域名合法嵌入(如 a.example.com 嵌入 b.example.com),该脚本必须配合服务端策略动态启用

Content-Security-Policy 的 frame-ancestors 怎么写才有效

frame-ancestors 是现代浏览器唯一推荐的防御方式,但写错就等于没写。它不继承、不 fallback,且值为空格分隔的源列表,不是正则也不是通配符。

典型错误:写成 frame-ancestors 'self' https://trusted.example.com 却忘了末尾分号;或误用 * 允许任意嵌入;或在 Express 中用 res.set('Content-Security-Policy', ...) 覆盖了其他必要指令(如 script-src)。

立即学习“前端免费学习笔记(深入)”;

  • 必须以分号结尾:Content-Security-Policy: frame-ancestors 'self';
  • 'self' 指当前协议+主机+端口,不包含子域名;要允许子域名得显式列出:frame-ancestors 'self' https://admin.example.com;
  • 禁止用 frame-ancestors *,Chrome/Firefox 已无视该写法
  • 若同时设置 X-Frame-Options,现代浏览器会优先采用 CSP,但旧版 IE 只认前者,建议双写(DENY 优先级高于 SAMEORIGIN

为什么禁用右键/选中不能防点击劫持

禁用 oncontextmenuuser-select: none 对点击劫持完全无效——攻击者根本不需要用户右键或复制,只要诱使鼠标左键落在透明 iframe 的目标按钮上就行。这类措施只干扰普通用户,反而给开发者一种“已防护”的错觉。

真实风险在于:你加了 onselectstart="return false",却没设 CSP;你用了 iframe 沙箱属性,却忘了 sandbox 默认禁用脚本,导致自己页面的 JS 失效;你混淆了 JS,但敏感操作仍暴露在 HTML 层。

  • 点击劫持本质是 UI 层欺骗,防御必须在加载源头阻断嵌入,而非在客户端限制交互行为
  • 所有前端 JS 防御(如 frame-busting)都可被 sandbox="allow-scripts" 或禁用 JS 绕过
  • 如果业务确实需要被嵌入(如 SaaS 管理后台 iframe 集成),唯一安全路径是服务端签发一次性 token + 严格校验 referer + CSP 动态生成

测试点击劫持漏洞时容易忽略的关键点

本地测试时,很多人打开 test.html 就看“页面有没有显示”,这完全跑偏。重点不是渲染结果,而是目标页面是否静默加载成功并保持登录态。

最容易被忽略的三个条件:测试前未登录目标站、目标页返回了 302 跳转到登录页、服务端设置了 Set-Cookie 但没带 SameSite=Lax 导致跨域请求丢失凭证。

  • 测试前必须手动登录目标站点,且保持会话未过期
  • 用 DevTools 的 Network 标签过滤目标域名,确认 withdraw 类接口发出且状态码为 200(不是 302 或 401)
  • Elements 面板里搜 iframe,确认子帧 DOM 已挂载,且其 src 属性值与你填写的一致
  • 如果目标页用了 document.domain = 'example.com',而测试页域名不同,iframe 会因同源策略失败——这不是防护生效,是跨域报错

真正难的不是加一行 header,而是厘清哪些页面必须绝对禁止嵌入(如支付页)、哪些可以有条件允许(如帮助文档)、哪些要支持嵌入但需鉴权(如报表看板)。这些决策一旦写死在 CSP 里,改起来牵一发而动全身。

热门栏目