很多站点把密码加密做得很到位,却在 Session 上留了口子。这篇是自查用的清单。
1. 登录成功后必须换会话 ID
否则会出现"会话固定":攻击者事先给你一个已知的会话 ID,你登录之后它就成了你的登录态,他拿同一个 ID 就能进来。
session_regenerate_id(true); // true = 同时销毁旧会话文件
$_SESSION['user_id'] = $user['id'];
2. Cookie 三个属性都要设
session_set_cookie_params(array(
'lifetime' => 0, // 关浏览器即失效
'path' => '/',
'httponly' => true, // JS 读不到,被 XSS 也偷不走
'samesite' => 'Lax', // 跨站请求不带会话
'secure' => true, // 只在 HTTPS 下发送
));
注意
secure只在确认走 HTTPS 时才开。误判会让浏览器直接丢掉 Cookie,表现为"登录成功但一刷新就掉线"。
3. 前后台用不同会话名
前台用户会话和后台管理员会话用两个 session 名(例如 NPUSER 与 NPADMIN)。这样即使前台被拿到,也不能顺手套到后台。
4. 明确会话什么时候失效
- 空闲超时:后台长时间不操作自动登出(例如 60 分钟)
- 并发会话:可选"同一账号只允许一处登录",异地登录顶掉旧会话
- 敏感信息变更后:改密码、换邮箱之后强制重新登录
5. 会话数据只存必要的
Session 里只放标识(用户 ID、登录时间),别放密码、别放完整令牌。会话文件就在服务器上,里面有什么、泄露的就是什么。
6. 退出要真的退出
- 清空会话数据、销毁会话,再让浏览器过期那条 Cookie
- 前端不要把"页面跳走"当成退出