如何使用持久 Cookie 在 PHP 登录系统中安全地实现'记住我”功能?

Susan Sarandon
发布: 2024-11-10 00:36:02
原创
416 人浏览过

How to Securely Implement

PHP 登录系统中用于安全“记住我”功能的持久 Cookie

简介

在 PHP 登录系统中实现“记住我”功能需要在用户的浏览器。此 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 个字符)和一个验证器(33 个字符) bytes) 使用 random_bytes() 函数或类似的方法来确保随机性。

使用以下内容设置记住我 cookie code:

setcookie(
    'remember',
    $selector . ':' . base64_encode($authenticator),
    time() + 864000, // expires in 10 days
    '/',
    'yourdomain.com',
    true, // TLS-only
    true  // http-only
);
登录后复制

将选择器、哈希验证器、用户 ID 和过期时间插入 auth_tokens 表。

页面加载时重新验证

在后续页面加载时,如果用户尚未登录并且记住我 cookie 为set:

  1. 从 cookie 中提取选择器和验证器。
  2. 在 auth_tokens 表中查询具有匹配选择器的行。
  3. 比较计算出的哈希值使用 hash_equals() 使用存储的哈希验证器提取验证器。
  4. 如果哈希匹配,通过设置会话数据并重新生成登录令牌来使用户登录。

详细信息

  • 碰撞抵抗: 9字节选择器提供72位防冲突性,33字节验证器提供264位防冲突性。位。
  • 哈希验证器:存储验证器的 SHA256 哈希可以降低与信息泄漏相关的风险。
  • 恒定时间比较:单独的选择器和验证器字段消除了对数据库查找的潜在计时攻击。

以上是如何使用持久 Cookie 在 PHP 登录系统中安全地实现'记住我”功能?的详细内容。更多信息请关注PHP中文网其他相关文章!

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