
session.save_path
配置指定的目录下。每个 Session 对应一个文件,文件名通常以sess_
为前缀,后跟 Session ID。// 启动或恢复Session
session_start();
// 可选:设置Session参数(需在session_start()之前调用)
session_set_cookie_params([
'lifetime' => 3600, // Session有效期(秒)
'path' => '/', // Cookie有效路径
'domain' => 'example.com',// Cookie有效域名
'secure' => true, // 仅通过HTTPS传输
'httponly' => true, // 禁止JavaScript访问
'samesite' => 'Lax' // 防止CSRF攻击
]);
注意:session_start()
必须放在任何输出之前,包括空格和 HTML 标签。
$_SESSION
操作 Session 数据:
// 存储数据
$_SESSION['user_id'] = 123;
$_SESSION['username'] = 'john_doe';
$_SESSION['preferences'] = [
'theme' => 'dark',
'notifications' => true
];
// 读取数据
if (isset($_SESSION['username'])) {
echo "欢迎回来," . $_SESSION['username'];
}
// 检查用户是否登录
function isLoggedIn() {
return isset($_SESSION['user_id']);
}
// 1. 删除单个Session变量
unset($_SESSION['preferences']);
// 2. 清空所有Session数据(保留Session ID)
$_SESSION = [];
// 3. 完全销毁Session(包括服务器数据和客户端Cookie)
session_destroy();
// 彻底清除需要额外删除Cookie
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(
session_name(),
'',
time() - 42000,
$params["path"],
$params["domain"],
$params["secure"],
$params["httponly"]
);
}
// 使用数据库存储Session(需先创建对应表结构)
ini_set('session.save_handler', 'user');
// 注册自定义存储函数
session_set_save_handler(
'open_session', // 打开
'close_session', // 关闭
'read_session', // 读取
'write_session', // 写入
'destroy_session', // 销毁
'gc_session' // 垃圾回收
);
// 示例:使用Redis存储Session
ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://127.0.0.1:6379?database=0');
// 配置Session过期时间(秒)
ini_set('session.gc_maxlifetime', 86400); // 24小时
// 配置垃圾回收概率(每100次请求触发一次)
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 100);
secure
参数,确保 Session Cookie 仅通过 HTTPS 传输httponly
参数,防止 JavaScript 窃取 Session ID
// 登录成功后更换Session ID,防止固定攻击
session_regenerate_id(true);
domain
和path
参数,限制 Cookie 的作用范围SameSite
属性防止跨站请求伪造 (CSRF):
ini_set('session.cookie_samesite', 'Strict');
// 结合用户IP和浏览器信息进行验证
$fingerprint = md5($_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']);
// 首次访问时存储指纹
if (!isset($_SESSION['fingerprint'])) {
$_SESSION['fingerprint'] = $fingerprint;
}
// 后续请求验证指纹
elseif ($_SESSION['fingerprint'] !== $fingerprint) {
// 指纹不匹配,可能是Session劫持
session_destroy();
die("安全验证失败,请重新登录");
}
session.save_path
目录权限session_start()
在所有输出之前调用