在php网站中,只要确保`$_session['user']`仅在用户成功登录后才被设置,后续页面只需检查该session变量是否存在即可;但为增强安全性,建议结合数据库中的认证token进行二次校验,并实施token轮换与过期机制。
在构建基于Session的身份验证系统时,核心原则是:Session是服务端状态,可信度高;而客户端Cookie(包括Session ID和自定义认证Cookie)本质上不可信,需谨慎对待。
✅ 推荐做法:
ict的持久化Cookie(例如 auth_token); // 示例:通用登录状态验证逻辑(建议封装为函数)
function requireAuth() {
if (!isset($_SESSION['user']) || !isset($_COOKIE['auth_token'])) {
header('Location: /login.php');
exit;
}
$userId = (int)$_SESSION['user'];
$token = $_COOKIE['auth_token'];
// 数据库校验:Token是否有效、未过期、归属当前用户
$stmt = $pdo->prepare(
"SELECT 1 FROM auth_tokens
WHERE user_id = ? AND token = ? AND expires_at > NOW() AND is_revoked = 0"
);
$stmt->execute([$userId, $token]);
if (!$stmt->fetch()) {
// 失效处理:清除本地Session和Cookie
$_SESSION = [];
session_destroy();
setcookie('auth_token', '', time() - 3600, '/', '', true, true);
header('Location: /login.php?error=invalid_session');
exit;
}
}⚠️ 关键注意事项:
综上,isset($_SESSION['user']) 是快速可用的初步判断,但生产环境必须辅以服务端Token校验——这不是过度设计,而是现代Web安全的基本实践。