php实现记住
PHP 实现记住登录功能
使用 Cookie 和 Session 结合的方式可以实现记住登录功能。以下是具体实现方法:

设置 Cookie 和 Session
在用户登录成功后,生成一个唯一的 token 并存入数据库,同时设置 Cookie 和 Session:

// 用户登录验证成功后
if ($login_success) {
// 生成唯一 token
$token = bin2hex(random_bytes(32));
// 存储 token 到数据库
$expires = time() + 86400 * 30; // 30 天后过期
$sql = "INSERT INTO user_tokens (user_id, token, expires) VALUES (?, ?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$user_id, $token, $expires]);
// 设置 Cookie
setcookie('remember_token', $token, $expires, '/');
// 设置 Session
$_SESSION['user_id'] = $user_id;
}
自动登录验证
在每次页面加载时检查是否存在 remember_token Cookie,并验证 token 是否有效:
// 检查 Session 是否已登录
if (!isset($_SESSION['user_id']) && isset($_COOKIE['remember_token'])) {
$token = $_COOKIE['remember_token'];
// 查询数据库验证 token
$sql = "SELECT user_id FROM user_tokens WHERE token = ? AND expires > ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$token, time()]);
$row = $stmt->fetch();
if ($row) {
// token 有效,设置 Session
$_SESSION['user_id'] = $row['user_id'];
// 可选:更新 token 过期时间
$new_expires = time() + 86400 * 30;
$sql = "UPDATE user_tokens SET expires = ? WHERE token = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$new_expires, $token]);
setcookie('remember_token', $token, $new_expires, '/');
}
}
注销处理
用户注销时需要清除 Session 和 Cookie:
// 注销操作
session_destroy();
// 清除 remember_token
if (isset($_COOKIE['remember_token'])) {
// 从数据库删除 token
$sql = "DELETE FROM user_tokens WHERE token = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$_COOKIE['remember_token']]);
// 清除 Cookie
setcookie('remember_token', '', time() - 3600, '/');
}
安全注意事项
- 使用 HTTPS 协议传输 Cookie
- 设置 Cookie 的 HttpOnly 和 Secure 属性
- 定期清理过期的 token
- 对 token 使用足够的熵值(长度)
// 更安全的 Cookie 设置
setcookie(
'remember_token',
$token,
[
'expires' => $expires,
'path' => '/',
'domain' => 'yourdomain.com',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict'
]
);
这种方法结合了 Session 和 Cookie 的优点,既保证了安全性又实现了记住登录功能。Session 用于短期验证,Cookie 用于长期记住用户。






