---
title: Session 安全清单：会话固定、Cookie 属性、并发会话
site: 星湖の小窝
category: PHP
tags: [PHP, Session, 安全]
date: 2026-10-08
updated: 2026-10-08
id: note-session-hardening
---

# Session 安全清单：会话固定、Cookie 属性、并发会话

很多站点把密码加密做得很到位，却在 Session 上留了口子。这篇是自查用的清单。

### 1. 登录成功后必须换会话 ID

否则会出现"会话固定"：攻击者事先给你一个已知的会话 ID，你登录之后它就成了你的登录态，他拿同一个 ID 就能进来。

```php
session_regenerate_id(true);   // true = 同时销毁旧会话文件
$_SESSION['user_id'] = $user['id'];
```

### 2. Cookie 三个属性都要设

```php
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
- 前端不要把"页面跳走"当成退出
