php 自动登录实现
PHP 自动登录实现方法
使用 Cookie 存储登录凭证
用户登录成功后生成一个唯一令牌(token),将其存储在数据库和用户浏览器的 Cookie 中。下次访问时通过比对 Cookie 中的令牌实现自动登录。
// 登录成功后生成令牌
$token = bin2hex(random_bytes(32));
setcookie('remember_token', $token, time() + 86400 * 30, '/');
// 将令牌存入数据库
$sql = "UPDATE users SET remember_token = ? WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$token, $user_id]);
验证自动登录
检查 Cookie 中是否存在令牌,并与数据库中的记录比对。

if (!isset($_SESSION['user_id']) && isset($_COOKIE['remember_token'])) {
$token = $_COOKIE['remember_token'];
$sql = "SELECT id FROM users WHERE remember_token = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$token]);
if ($user = $stmt->fetch()) {
$_SESSION['user_id'] = $user['id'];
}
}
安全增强措施
为提升安全性,可以结合用户代理和 IP 地址进行验证。

$user_agent = $_SERVER['HTTP_USER_AGENT'];
$ip = $_SERVER['REMOTE_ADDR'];
$token_hash = hash('sha256', $token . $user_agent . $ip);
// 存储和验证时使用哈希值
令牌过期与更新
定期更新令牌并设置过期时间,降低安全风险。
// 更新令牌
function refresh_token($user_id) {
$new_token = bin2hex(random_bytes(32));
setcookie('remember_token', $new_token, time() + 86400 * 30, '/');
$sql = "UPDATE users SET remember_token = ? WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$new_token, $user_id]);
}
退出登录处理
用户主动退出时需要清除 Cookie 和数据库中的令牌。
setcookie('remember_token', '', time() - 3600, '/');
$sql = "UPDATE users SET remember_token = NULL WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$_SESSION['user_id']]);
session_destroy();
注意事项
- 使用 HTTPS 协议保护 Cookie 传输安全
- 设置 Cookie 的 HttpOnly 和 Secure 属性
- 定期清理数据库中过期的令牌
- 考虑使用更安全的加密方式存储令牌






