PHP Session 与 Cookie:会话管理实战指南
时间:2026-10-4 10:21 作者:emer 分类: 无
前言
HTTP 是无状态的,你每次请求服务器都不认识你。Session 和 Cookie 就是用来解决这个问题的。本文讲清楚 PHP 中 Session 和 Cookie 的用法。
一、Cookie 是什么
Cookie 是存在浏览器里的小数据,每次请求自动带给服务器。
设置 Cookie
setcookie("username", "张三", time() + 3600, "/");
参数说明:
- 第一个参数:名称
- 第二个参数:值
- 第三个参数:过期时间(时间戳)
- 第四个参数:路径
读取 Cookie
echo $_COOKIE['username'];
删除 Cookie
setcookie("username", "", time() - 3600, "/");
把过期时间设成过去就行。
二、Session 是什么
Session 是存在服务器上的数据,通过 Session ID 识别用户。
启动 Session
session_start();
注意:必须在输出之前调用,不然会报错。
存数据
$_SESSION['user_id'] = 1;
$_SESSION['username'] = '张三';
读数据
echo $_SESSION['username'];
删除单个数据
unset($_SESSION['user_id']);
销毁 Session
session_destroy();
三、Session 和 Cookie 的区别
| 对比 | Cookie | Session |
|---|---|---|
| 存储位置 | 浏览器 | 服务器 |
| 大小限制 | 4KB | 无限制 |
| 安全性 | 低(用户能改) | 高 |
| 生命周期 | 可设置 | 默认浏览器关闭就没 |
四、登录功能示例
登录页
<?php
session_start();
if ($_POST) {
$username = $_POST['username'];
$password = $_POST['password'];
// 验证用户名密码
if ($username == 'admin' && $password == '123456') {
$_SESSION['user_id'] = 1;
$_SESSION['username'] = $username;
header('Location: dashboard.php');
exit;
} else {
echo "用户名或密码错误";
}
}
?>
判断是否登录
<?php
session_start();
if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
?>
退出登录
<?php
session_start();
session_destroy();
header('Location: login.php');
exit;
?>
五、Session 配置
修改 Session 有效期
ini_set('session.gc_maxlifetime', 3600); // 1小时
session_start();
修改 Session 存储路径
session_save_path('/tmp/sessions');
session_start();
用 Redis 存储 Session
生产环境推荐用 Redis 存 Session,默认文件存储性能差。
php.ini 配置:
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"
六、安全问题
1. Session 劫持
别人拿到你的 Session ID,就能冒充你。
防护:
- 用 HTTPS
- Session ID 定期更换
- 绑定 IP(不太推荐,IP 会变)
2. Cookie 劫持
别人拿到你的 Cookie,就能冒充你。
防护:
- 设置 HttpOnly,JS 读不到
- 设置 Secure,只在 HTTPS 下传
- 设置 SameSite,防止 CSRF
setcookie("token", $token, [
'expires' => time() + 3600,
'path' => '/',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict'
]);
3. CSRF 攻击
别人伪造你的请求。
防护:
- 表单加 CSRF Token
- 验证 Referer
七、常见坑
- session_start() 在输出之后:报错 headers already sent
- Session 没销毁:退出登录后还能访问
- Cookie 大小限制:别存太多东西,超过 4KB 就丢
- Session 文件太多:默认文件存储,大了要清理
八、最佳实践
- 敏感数据用 Session,别存 Cookie
- Cookie 加 HttpOnly 和 Secure
- 生产环境用 Redis 存 Session
- 登录成功后重新生成 Session ID,防止固定攻击
// 登录成功后
session_regenerate_id(true);
总结
Session 和 Cookie 的核心要点:
- Cookie 存在浏览器,Session 存在服务器
- session_start() 必须在输出之前调用
- Session 更安全,Cookie 更轻量
- 生产环境用 Redis 存 Session
- Cookie 加 HttpOnly 和 Secure,防劫持
登录、权限、购物车,都离不开 Session 和 Cookie。搞懂这俩,PHP 后端才算入门。