最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
强化动态属性安全性:防止点击劫持的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)
为什么禁用右键/选中不能防点击劫持
禁用 oncontextmenu 或 user-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 里,改起来牵一发而动全身。
相关文章
- 诛仙2玩法是什么 07-08
- 异环伊波恩合伙人行动任务完成指引 07-08
- DNF盛夏沁甜菠萝宝珠1属性全览 07-08
- DNF盛夏惬意特饮属性全览 07-08
- 理智边缘好玩不 理智边缘玩法简介 07-08
- 崩坏星穹铁道千冶刃玩法解析 07-08