当前位置:首页 > PHP

记住密码 php实现

2026-02-15 04:08:02PHP

实现记住密码功能的方法

使用PHP实现记住密码功能通常涉及生成并存储持久性登录凭证(如Cookie),以下是一种常见实现方式:

设置记住密码Cookie

用户登录时若勾选"记住我",生成长期有效的Token并存储:

记住密码 php实现

if ($login_success && isset($_POST['remember_me'])) {
    $selector = bin2hex(random_bytes(8));
    $validator = bin2hex(random_bytes(32));
    $token = $selector . ':' . $validator;
    $hashedValidator = password_hash($validator, PASSWORD_DEFAULT);
    $expires = time() + 86400 * 30; // 30天有效期

    // 存储到数据库
    $stmt = $pdo->prepare("INSERT INTO auth_tokens (user_id, selector, hashed_validator, expires) VALUES (?, ?, ?, ?)");
    $stmt->execute([$user_id, $selector, $hashedValidator, date('Y-m-d H:i:s', $expires)]);

    // 设置Cookie
    setcookie('remember_token', $token, $expires, '/', '', true, true);
}

验证记住密码的Token

每次页面加载时检查是否存在记住密码的Cookie:

记住密码 php实现

if (!isset($_SESSION['user_id']) && isset($_COOKIE['remember_token'])) {
    list($selector, $validator) = explode(':', $_COOKIE['remember_token']);

    $stmt = $pdo->prepare("SELECT * FROM auth_tokens WHERE selector = ? AND expires >= NOW()");
    $stmt->execute([$selector]);
    $token = $stmt->fetch();

    if ($token && password_verify($validator, $token['hashed_validator'])) {
        $_SESSION['user_id'] = $token['user_id'];

        // 可选:更新Token延长有效期
        $newValidator = bin2hex(random_bytes(32));
        $newHashedValidator = password_hash($newValidator, PASSWORD_DEFAULT);
        $newToken = $selector . ':' . $newValidator;
        setcookie('remember_token', $newToken, time() + 86400 * 30, '/', '', true, true);

        $stmt = $pdo->prepare("UPDATE auth_tokens SET hashed_validator = ? WHERE id = ?");
        $stmt->execute([$newHashedValidator, $token['id']]);
    }
}

安全注意事项

实现记住密码功能时需注意以下安全措施:

  • 始终使用HTTPS传输Cookie
  • 设置Cookie的HttpOnly和Secure属性
  • Token应包含随机生成的selector和validator两部分
  • validator需哈希后存储,类似密码存储方式
  • 定期清理过期的Token记录
  • 提供用户手动注销所有设备的功能

数据库表结构示例

用于存储Token的数据库表建议结构:

CREATE TABLE auth_tokens (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    selector VARCHAR(16) NOT NULL,
    hashed_validator VARCHAR(255) NOT NULL,
    expires DATETIME NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    UNIQUE KEY (selector)
);

这种实现方式比直接存储用户名密码更安全,且允许用户在不同设备间管理登录状态。

标签: 密码php
分享给朋友:

相关文章

php实现定时任务

php实现定时任务

PHP 实现定时任务的几种方法 在 PHP 中实现定时任务可以通过多种方式完成,具体选择取决于项目需求和服务器环境。以下是常见的实现方法: 使用 Cron 任务 Cron 是 Linux 系统中常用…

php实现即时通讯

php实现即时通讯

PHP 实现即时通讯的方案 即时通讯(IM)可以通过多种方式实现,PHP 作为服务器端语言,通常需要结合前端技术(如 WebSocket、AJAX)或第三方服务来实现实时通信。以下是几种常见的实现方式…

php实现统计

php实现统计

PHP 实现统计功能 在 PHP 中实现统计功能通常涉及数据的收集、处理和展示。以下是一些常见的统计实现方法: 数据库数据统计 通过 SQL 查询可以直接从数据库中获取统计结果: $conn =…

php实现伪静态

php实现伪静态

PHP 实现伪静态的方法 伪静态(URL Rewrite)是一种将动态URL转换为看似静态URL的技术,提升SEO友好性和用户体验。以下是几种常见的实现方式: 使用 Apache 的 mod_rew…

php 路由实现的

php 路由实现的

PHP 路由实现方法 基于原生 PHP 实现路由 创建一个简单的路由解析器,通过解析 URL 路径来调用对应的控制器或函数。 // 定义路由表 $routes = [ '/' => '…

php实现秒杀

php实现秒杀

PHP实现秒杀功能的关键技术 秒杀系统需要解决高并发、数据一致性、系统稳定性等问题。以下是PHP实现秒杀功能的核心技术方案: 数据库优化 使用InnoDB引擎的行级锁和事务特性,确保数据一致性。商品…