如何使用 PHP 和 cookie 实现安全的'记住我”功能?

Susan Sarandon
发布: 2024-11-11 00:26:02
原创
586 人浏览过

How can I implement a secure

PHP 登录系统:记住我(持久 cookie)

简介

实现“记住我”功能允许用户即使在关闭浏览器后也能保持登录状态。此功能增强了用户便利性并改善了整体用户体验。在本文中,我们将深入研究一种在用户浏览器中存储和验证 Cookie 的安全方法,以实现持久登录机制。

安全地存储 Cookie

安全地存储存储 cookie,我们在数据库中使用单独的表:

CREATE TABLE `auth_tokens` (
    `id` integer(11) not null UNSIGNED AUTO_INCREMENT,
    `selector` char(12),
    `token` char(64),
    `userid` integer(11) not null UNSIGNED,
    `expires` datetime,
    PRIMARY KEY (`id`)
);
登录后复制

记录后处理在

成功登录并启用“记住我”选项后:

  • 生成一个12字符选择器(例如,使用base64_encode(random_bytes(9)))。
  • 生成一个 33 字节的验证器(例如,使用random_bytes(33))。
  • 使用以下值设置 cookie:

    'remember': $selector.':'.base64_encode($authenticator)
    登录后复制
  • 将选择器、哈希验证器、用户 ID 和过期日期存储在auth_tokens 数据库表。

重新验证页面加载时

重新验证用户身份:

if (empty($_SESSION['userid']) && !empty($_COOKIE['remember'])) {
    list($selector, $authenticator) = explode(':', $_COOKIE['remember']);

    $row = $database->selectRow(
        "SELECT * FROM auth_tokens WHERE selector = ?",
        [
            $selector
        ]
    );

    if (hash_equals($row['token'], hash('sha256', base64_decode($authenticator)))) {
        $_SESSION['userid'] = $row['userid'];
        // Regenerate login token and update database
    }
}
登录后复制

方法详细信息

  • 抗碰撞性: 使用 9 个字节作为选择器提供 72 位
  • 假冒保护:在数据库中存储散列验证器可以降低假冒风险。
  • 定时攻击对策:散列比较之前的验证器值并将选择器与验证器分开以防止计时
  • 数据库安全: auth_tokens 表允许轻松删除和过期过期令牌,维护数据库完整性。

以上是如何使用 PHP 和 cookie 实现安全的'记住我”功能?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板