php实现记住密码
实现记住密码功能的方法
使用PHP实现记住密码功能通常需要结合Cookie和Session技术。以下是几种常见的实现方式:
使用Cookie存储登录信息
在用户登录时创建一个长期有效的Cookie来存储用户标识:

// 用户登录验证成功后
if ($login_success) {
$remember_token = bin2hex(random_bytes(32)); // 生成随机令牌
$expire = time() + 60 * 60 * 24 * 30; // 30天有效期
// 存储令牌到数据库
$stmt = $pdo->prepare("UPDATE users SET remember_token = ? WHERE id = ?");
$stmt->execute([$remember_token, $user_id]);
// 设置Cookie
setcookie('remember_token', $remember_token, $expire, '/', '', true, true);
setcookie('user_id', $user_id, $expire, '/', '', true, true);
}
自动登录验证
在每次页面加载时检查是否存在记住密码的Cookie:
if (!isset($_SESSION['user_id']) && isset($_COOKIE['remember_token']) && isset($_COOKIE['user_id'])) {
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ? AND remember_token = ?");
$stmt->execute([$_COOKIE['user_id'], $_COOKIE['remember_token']]);
if ($user = $stmt->fetch()) {
$_SESSION['user_id'] = $user['id'];
// 更新令牌有效期
setcookie('remember_token', $_COOKIE['remember_token'], time() + 60 * 60 * 24 * 30, '/', '', true, true);
setcookie('user_id', $user['id'], time() + 60 * 60 * 24 * 30, '/', '', true, true);
}
}
安全注意事项
实现记住密码功能时需要特别注意安全性:

- 使用HTTPS传输Cookie
- 设置HttpOnly和Secure标志
- 令牌应该是随机且不可预测的
- 令牌应该有有效期限制
- 用户修改密码后应使所有令牌失效
登出处理
用户登出时需要清除会话和Cookie:
// 清除会话
session_destroy();
// 清除Cookie
setcookie('remember_token', '', time() - 3600, '/', '', true, true);
setcookie('user_id', '', time() - 3600, '/', '', true, true);
// 数据库中的令牌也应清除
if (isset($_COOKIE['user_id'])) {
$stmt = $pdo->prepare("UPDATE users SET remember_token = NULL WHERE id = ?");
$stmt->execute([$_COOKIE['user_id']]);
}
替代方案:持久会话
另一种方法是使用持久会话而不是单独的Cookie:
// 设置持久会话
ini_set('session.gc_maxlifetime', 60 * 60 * 24 * 30);
session_set_cookie_params(60 * 60 * 24 * 30);
session_start();
这种方法更简单但灵活性较低,且安全性依赖于会话管理配置。





