当前位置:首页 > 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实现mysql

php实现mysql

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

php队列的实现

php队列的实现

PHP队列的实现方式 PHP中实现队列功能可以通过多种方式,根据需求选择适合的方案: 使用数组实现基础队列 PHP数组本身支持队列操作,利用array_push和array_shift函数: $q…

php 实现跳转

php 实现跳转

PHP 实现页面跳转的方法 在PHP中,实现页面跳转可以通过多种方式完成,以下是几种常用的方法: 使用header函数 header函数是PHP中最常用的跳转方法,通过发送HTTP头部信息实现跳转。…

无限分类实现 php

无限分类实现 php

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、部门架构等。以下是几种常见的实现方式: 邻接列表模式(Adjacency List) 邻接列表是最简单的实现方式,通过在每个记录…

php 实现评论

php 实现评论

实现 PHP 评论功能 数据库设计 创建数据库表存储评论数据,通常包含以下字段: id:评论唯一标识 user_id:用户ID content:评论内容 created_at:评论时间 parent…

php实现支付宝支付

php实现支付宝支付

支付宝支付集成步骤 准备工作 在开始集成支付宝支付前,确保已注册支付宝开放平台账号并完成企业实名认证。创建应用后获取APPID、应用私钥和支付宝公钥。 配置支付宝SDK 通过Composer安装支付…