当前位置:首页 > PHP

php实现记住我

2026-02-16 00:00:22PHP

PHP 实现记住我功能

实现记住我功能通常涉及生成持久化的登录令牌(如 Cookie),并在用户下次访问时自动验证。以下是具体实现方法:

生成并存储登录令牌

用户登录时生成唯一令牌,存储到数据库和客户端 Cookie:

// 用户登录成功后
if ($remember_me) {
    $token = bin2hex(random_bytes(32)); // 生成随机令牌
    $expiry = time() + 60 * 60 * 24 * 30; // 30天后过期

    // 存储到数据库(示例使用PDO)
    $stmt = $pdo->prepare("INSERT INTO remember_tokens (user_id, token, expires) VALUES (?, ?, ?)");
    $stmt->execute([$user_id, hash('sha256', $token), date('Y-m-d H:i:s', $expiry)]);

    setcookie('remember_token', $token, $expiry, '/', '', true, true); // 安全设置
}

验证记住我令牌

每次页面加载时检查是否存在有效令牌:

if (!isset($_SESSION['user_id']) && isset($_COOKIE['remember_token'])) {
    $token = $_COOKIE['remember_token'];
    $hashed_token = hash('sha256', $token);

    // 查询数据库
    $stmt = $pdo->prepare("SELECT user_id, expires FROM remember_tokens WHERE token = ? AND expires > NOW()");
    $stmt->execute([$hashed_token]);
    $row = $stmt->fetch();

    if ($row) {
        $_SESSION['user_id'] = $row['user_id']; // 重新登录用户
        // 可选:更新令牌延长有效期(见下方)
    }
}

安全增强措施

令牌轮换
每次验证后生成新令牌,防止固定令牌被窃取:

php实现记住我

// 验证成功后
$new_token = bin2hex(random_bytes(32));
$new_expiry = time() + 60 * 60 * 24 * 30;

// 更新数据库
$pdo->prepare("UPDATE remember_tokens SET token = ?, expires = ? WHERE token = ?")
    ->execute([hash('sha256', $new_token), date('Y-m-d H:i:s', $new_expiry), $hashed_token]);

// 设置新Cookie
setcookie('remember_token', $new_token, $new_expiry, '/', '', true, true);

清理过期令牌
定期清理数据库中的过期令牌:

$pdo->exec("DELETE FROM remember_tokens WHERE expires < NOW()");

用户登出处理

用户主动登出时删除令牌:

php实现记住我

// 删除数据库令牌
if (isset($_COOKIE['remember_token'])) {
    $hashed_token = hash('sha256', $_COOKIE['remember_token']);
    $pdo->prepare("DELETE FROM remember_tokens WHERE token = ?")->execute([$hashed_token]);

    // 删除Cookie
    setcookie('remember_token', '', time() - 3600, '/');
}

注意事项

  1. HTTPS 必需
    确保网站启用 HTTPS,防止 Cookie 被中间人窃取。

  2. SameSite 属性
    设置 Cookie 时建议添加 SameSite 属性:

    setcookie('remember_token', $token, [
        'expires' => $expiry,
        'path' => '/',
        'secure' => true,
        'httponly' => true,
        'samesite' => 'Strict'
    ]);
  3. 令牌熵值
    使用 random_bytes()openssl_random_pseudo_bytes() 确保令牌足够随机。

通过以上方法可实现安全可靠的记住我功能,兼顾用户体验与账户安全。

标签: 记住我php
分享给朋友:

相关文章

php实现队列

php实现队列

PHP实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_shi…

php实现

php实现

PHP 实现的基本方法 PHP 是一种服务器端脚本语言,广泛用于 Web 开发。以下是 PHP 实现的一些常见方法。 变量与数据类型 PHP 变量以 $ 开头,支持多种数据类型: $nam…

php长连接实现

php长连接实现

PHP 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HTTP…

php实现mysql

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面向对…

php实现文件的下载

php实现文件的下载

PHP 实现文件下载的方法 在 PHP 中实现文件下载功能通常需要设置正确的 HTTP 头信息,并输出文件内容。以下是几种常见的实现方式: 使用 header() 函数强制下载 通过设置 Conte…

php实现登陆

php实现登陆

PHP 实现登录功能 创建登录表单 在 HTML 文件中创建一个登录表单,包含用户名和密码输入框,表单的 action 属性指向处理登录的 PHP 文件。 <form action="logi…