跳到正文
>_ITDITDWeb 安全平台

术语表

会话固定(Session Fixation)是什么 — 让用户用攻击者准备好的 ID 登录的漏洞

会话固定(Session Fixation)是指攻击者预先准备一个 session ID 让受害者使用,待受害者用该 ID 登录后,再用同一个 ID 进行「冒充」的攻击。本文以图解说明其原理,并从防御角度讲解关键防御手段(登录时重新生成 session ID、不从 URL 接收 ID、Cookie 属性),不公开攻击步骤。

发布于 2026-06-11 更新于 2026-06-11 1 分钟阅读

「攻击者准备好一个 ID,受害者却用它完成了登录」——这就是会话固定。本文讲解它的原理与可靠的防御方法(不公开攻击步骤)。

为什么会成立(原理)

关键在于「登录前后 session ID 不变」这种设计。只要它不变,攻击者在登录前就已知的 ID,在登录后仍会被当作「已认证」而通行。

① 攻击者让受害者使用「某个 session ID」(通过链接等)
↓ 受害者就用那个 ID 登录
② ID 没有被重新生成=同一个 ID 变成「已认证」
↓ 攻击者一开始就知道那个 ID
③ 用同一个 ID 访问=冒充受害者
如果登录后 ID 不变,攻击者事先已知的 ID 就会原样变成已认证状态。

它有时会与 CSRFXSS 组合使用,但会话固定本身的本质只有一点:「登录时没有重新生成 ID」。

防御:登录时重新生成 ID

1

登录成功时重新生成 session ID(最重要)

在认证成立的那一刻,丢弃旧 ID 并发出新的 session ID(许多框架的 session regenerate / renew)。事先埋下的 ID 立即失效。在权限提升的操作(如提升为管理员等)时也要重新生成。
2

不接受通过 URL 指定 session ID

session ID 要用 Cookie 处理,忽略从 URL 参数指定的 ID。堵住攻击者让受害者踩中「想要固定的 ID」的入口。
3

加固 Cookie 属性

给会话 Cookie 加上 HttpOnly(JS 无法读取)、Secure(仅 HTTPS)、SameSite(抑制从其他站点发起的发送)。把相关的劫持路径一并削弱。
4

设置合理的失效

通过固定时长、登出、修改密码使会话失效。不让被固定的 ID 长期存活。

本站观点:别关掉框架的『重新生成』

会话固定不需要自己精心设计的对策,靠「登录时重新生成 ID」这一招基本就能封堵。重要的是不要不小心关掉、也不要忘记调用框架已经准备好的这个机制。与其自己实现一套会话管理,不如依靠经过实战检验的实现的默认行为,更安全。本站坚持「认证和密钥相关的东西不自己造、不关掉默认的安全侧」这一原则。与 IDOR 一样,认证、授权相关的关键,就是「靠机制让它每次都生效」。

延伸阅读

FAQ

Q会话固定和会话劫持有什么区别?
A

会话劫持(hijacking)是「窃取」别人已经发出的 session ID 的攻击。会话固定(fixation)正相反,是攻击者先把「自己已知的 ID」交给受害者使用,等待受害者用该 ID 登录的攻击。它的特点不是窃取,而是让一个一开始就已知的 ID 变成已认证状态。

Q最有效的防御是什么?
A

就是『在登录的那一刻重新生成 session ID』。许多框架和会话库都有这个功能(session regenerate / renew),在认证成立的时刻丢弃旧 ID 并发出新 ID。仅此一项,攻击者事先埋下的 ID 就会失效。在权限提升的操作(如提升为管理员等)时也要重新生成。

Q为什么把 session ID 放进 URL 很危险?
A

ID 一旦出现在 URL 中,就容易通过链接分享、Referer、日志、浏览器历史泄露给第三方,成为攻击者让受害者踩中「想要固定的 ID」的入口。session ID 应当用 Cookie 处理而不是 URL 参数,并且不接受通过 URL 指定 ID,这样才安全。