如何实现记住我的功能?

goo*_*ing 8 php mysql cookies session

可能重复:
为网站实现"记住我"的最佳方式是什么?

每个用户都有唯一的32个字符ID(由此组成:) md5("salt" . $username . $user_password . "salt2");.我将此值存储在表用户的"unique_id"字段下.将此值分配给用户的cookie并让他只有在分配后才能登录是一种好方法吗?当然,检查数据库中是否存在该值?

我认为这不是一个好习惯,因为如果有人偷了你的cookie,他们就可以登录你的账户了.

什么是其他/更好的解决方案?当然最安全的事情可能只是将它存储在会话中,但我想实现这个记住我的功能.

谢谢.

A.N*_*lam 4

假设持久 cookie 的数据库表名称是pcookies,其中包含以下列:

  • cookie_id(字符)
  • 用户 ID (INT)
  • 到期(日期时间)
  • 盐(字符)

Cookie创建步骤:

  1. 登录成功后,在数据库中创建一个具有唯一id的cookie记录。您可以通过 hash_hmac('sha512', $token, $salt) 生成它,其中 $token=uniqid($user_id, TRUE) 和 $salt=md5(mt_rand()) 。
  2. 将“用户 ID”、“过期时间”和“盐”以及“cookie id”存储在数据库中。
  3. 将“cookie id”和“令牌”存储在 cookie 中。

认证步骤:

  1. 如果找到持久性cookie,首先检查该记录在数据库中是否可用。
  2. 如果记录可用,则检查 cookie 是否过期。
  3. 如果 cookie 没有过期,则通过 $cookie_id == hash_hmac('sha512',$token_from_cookie,$salt_from_db) 验证 cookie id。
  4. 一旦 cookie 被验证,从数据库中删除它并根据上述 cookie 创建步骤创建一个新的 cookie。
  5. 如果发现 cookie 无效,则从设备中清除 cookie,并从数据库中删除用户的所有其他 cookie 记录,注意盗窃企图的使用,然后继续手动登录过程。

笔记:

  • 当会话可用时,忽略检查 cookie。
  • 注销后,清除 cookie 以及数据库记录。
  • 绝不允许用户执行敏感请求,例如更改密码或通过持久 Cookie 登录查看信用卡信息。调用密码登录并在会话中添加标志以允许所有后续操作。