如何实现记住我的功能?

时间:2012-03-27 13:44:29

标签: php mysql session cookies

  

可能重复:
  What is the best way to implement “remember me” for a website?

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

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

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

感谢。

2 个答案:

答案 0 :(得分:4)

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

  • cookie_id(CHAR)
  • user_id(INT)
  • 到期(DATETIME)
  • 盐(CHAR)

Cookie创建步骤:

  1. 成功登录后,在唯一ID下的数据库中创建cookie记录。您可以通过hash_hmac('sha512',$ token,$ salt)生成它,其中$ token = uniqid($ user_id,TRUE)和$ salt = md5(mt_rand())。
  2. 在数据库中存储'用户ID','到期时间'和'盐'以及'cookie id'。
  3. 在Cookie中存储'cookie id'和'token'。
  4. 身份验证步骤:

    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记录,注意使用盗窃企图并继续手动登录过程。
    6. 备注:

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

答案 1 :(得分:1)

这两篇文章为持久登录cookie提供了出色的实施指南:

(按照给定的顺序阅读它们,因为第二个改进了第一个。)