防PHP会话固定攻击需切断预设Session ID传递路径并在身份确认后立即更换ID:登录前禁用复用、启用strict_mode、禁用trans_sid;认证成功后调用session_regenerate_id(true)彻底废弃旧会话;配合HttpOnly、Secure Cookie及仅Cookie模式,并辅以User-Agent/IP校验与敏感操作重生成等纵深防御措施。

防PHP会话固定攻击,核心是切断攻击者预设Session ID的传递路径,并在用户身份确认后立即更换ID。
登录前不复用已有Session ID
用户未认证时,不应沿用已存在的session_id——哪怕只是访问登录页。PHP默认可能复用URL参数或Cookie中的旧ID,这正是攻击入口。
- 启用session.use_strict_mode = 1(php.ini),让PHP拒绝未经初始化的ID,强制生成新会话
- 禁用session.use_trans_sid,防止Session ID通过URL泄露
- 登录页面首次加载时,可主动调用session_destroy()再session_start(),清空潜在污染
认证成功后必须重生成Session ID
只要用户完成密码校验、短信验证等可信身份确认动作,就要立刻废弃当前会话,换一个全新的ID。
- 调用session_regenerate_id(true),true参数表示同时删除旧会话文件
- 不要只改ID而保留旧数据;必须确保旧ID彻底失效,否则攻击者仍可能凭旧ID访问
- 此操作应在写入$_SESSION['user']等敏感数据之前执行
传输层与存储层双重加固
即使ID被换,若传输或存储环节不安全,仍可能被截获或预测。
立即学习“PHP免费学习笔记(深入)”;
- 设置session.cookie_httponly = 1,阻止JavaScript读取Cookie
- 设置session.cookie_secure = 1,确保Cookie仅走HTTPS
- 搭配session.use_only_cookies = 1,禁用URL传参式会话,杜绝ID暴露在日志或Referer中
配合其他机制形成纵深防御
单靠会话管理无法覆盖所有风险,需结合上下文做补充防护。
- 登录后检查User-Agent或IP变化过大时,可触发二次验证或强制重新登录
- 对高敏感操作(如修改密码、转账)再次调用session_regenerate_id(true)
- 设置合理session.gc_maxlifetime,避免长期闲置会话成为靶子



















