贝利信息

PHP网站登录状态验证:Session与认证Cookie的正确使用方式

日期:2026-01-04 00:00 / 作者:花韻仙語

在php网站中,只要确保`$_session['user']`仅在用户成功登录后才被设置,后续页面只需检查该session变量是否存在即可;但为增强安全性,建议结合数据库中的认证token进行二次校验,并实施token轮换与过期机制。

在构建基于Session的身份验证系统时,核心原则是:Session是服务端状态,可信度高;而客户端Cookie(包括Session ID和自定义认证Cookie)本质上不可信,需谨慎对待

✅ 推荐做法:

// 示例:通用登录状态验证逻辑(建议封装为函数)
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安全的基本实践。