基本使用步骤
1. **开启session**
在使用session之前,需要先调用`session_start()`函数。这个函数要在输出任何内容之前执行,包括HTML标签。
php
<?php
session_start(); // 开启会话
// 现在可以访问和设置$_SESSION变量了
2. **存储数据**
通过`$_SESSION`超全局数组来存储用户数据。
php
$_SESSION['user_id'] = 123;
$_SESSION['username'] = 'john_doe';
$_SESSION['is_logged_in'] = true;
3. **读取数据**
在其他页面中开启session后,就能读取之前存储的数据。
php
<?php
session_start(); // 必须先开启会话
// 读取会话数据
if (isset($_SESSION['is_logged_in']) && $_SESSION['is_logged_in']) {
echo "欢迎回来," . $_SESSION['username'];
} else {
header("Location: login.php"); // 未登录则跳转到登录页面
exit;
}
4. **删除数据**
可以使用`unset()`函数删除特定的session变量,或者用`session_destroy()`函数销毁整个session。
php
// 删除单个变量
unset($_SESSION['username']);
// 销毁整个session(但会话ID仍然存在)
session_destroy();
// 彻底清除会话数据和cookie(推荐做法)
session_unset(); // 清除所有会话变量
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(
session_name(),
'',
time() - 42000,
$params["path"],
$params["domain"],
$params["secure"],
$params["httponly"]
);
}
常见设置
在PHP中,session有多种配置选项,你可以通过以下两种方式进行设置:
1. **修改php.ini文件**
找到并修改`php.ini`文件中的相关设置,修改完成后需要重启Web服务器。
ini
session.cookie_lifetime = 3600 # 会话cookie的有效期(秒)
session.gc_maxlifetime = 1440 # 会话数据在垃圾回收机制中的保留时间(秒)
session.name = PHPSESSID # 会话cookie的名称
session.use_strict_mode = 1 # 启用严格模式,只接受合法的会话ID
session.cookie_secure = 1 # 只通过HTTPS发送cookie
session.cookie_httponly = 1 # 禁止JavaScript访问cookie
session.save_path = "/path/to/session" # 会话文件的存储路径
2. **在代码中动态设置**
在调用`session_start()`之前,可以使用`ini_set()`函数动态修改session设置。
php
<?php
// 设置会话cookie有效期为1小时(3600秒)
ini_set('session.cookie_lifetime', 3600);
// 设置会话数据的垃圾回收时间为1小时
ini_set('session.gc_maxlifetime', 3600);
// 启用严格模式
ini_set('session.use_strict_mode', 1);
// 只通过HTTPS发送cookie
ini_set('session.cookie_secure', 1);
// 禁止JavaScript访问cookie
ini_set('session.cookie_httponly', 1);
// 启动会话
session_start();
安全注意事项
1. **会话固定攻击防范**
在用户登录后,应重新生成会话ID。
php
<?php
// 用户登录验证成功后
session_regenerate_id(true); // 生成新的会话ID并删除旧的会话文件
$_SESSION['user_id'] = $user_id;
$_SESSION['is_logged_in'] = true;
2. **防止XSS攻击**
对所有输出的会话数据进行转义处理。
php
<?php
// 输出前进行HTML转义
echo htmlspecialchars($_SESSION['username'], ENT_QUOTES, 'UTF-8');
3. **防止CSRF攻击**
为表单或敏感操作生成CSRF令牌。
php
<?php
// 生成CSRF令牌
if (!isset($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
// 在表单中包含令牌
echo '<input type="hidden" name="csrf_token" value="'. $_SESSION['csrf_token'] .'">';
// 验证令牌
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('CSRF验证失败');
}
}
最佳实践
- 尽量减少session中存储的数据量,只保存必要的信息。
- 对敏感数据不要直接存储在session中,而是存储加密后的数据。
- 定期监控session存储目录的磁盘使用情况。
- 在用户注销或长时间不活动后,及时销毁session。
通过合理使用PHP session,你可以实现安全、高效的用户会话管理,为网站或应用提供良好的用户体验。