很多站点把密码加密做得很到位,却在 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
  • 前端不要把"页面跳走"当成退出