2012-03-27 100 views
8

可能重复:
What is the best way to implement “remember me” for a website?如何实现记住我的功能?

每个用户都有唯一的32个字符ID(这样做的:md5("salt" . $username . $user_password . "salt2");)。我将这个值存储在表用户的'unique_id'字段下。将这个值分配给用户的cookie并让他只有在分配后才能登录?当然,检查它是否存在于数据库中?

我不认为这是一种好的做法,因为如果有人窃取了您的cookie,他们将能够登录到您的帐户。

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

谢谢。

+1

我相信几乎所有人都记得我的特点已经是vul易受饼干偷窃。窃取用户的cookies通常非常困难,除非您的网站存在XSS漏洞,这本身就是一个非常重要的漏洞。 – mellamokb 2012-03-27 13:49:37

+3

这里有一些很好的参考文献http://stackoverflow.com/a/3128997/46675 – 2012-03-27 13:53:48

+0

@mellamokb这是真的吗?出于某种原因,我出于某种原因想象人们将某些东西连接到我的网站并拦截所有传输的Cookie(我知道这很愚蠢),这就是为什么我删除了旧系统将其密码存储在cookie中的原因(又是一个糟糕的系统,我会无论如何,都不会再使用它:P)。是否只有XSS可以通过? – 2012-03-27 16:57:51

回答

3

说数据库表中的持久性cookie的名称是pcookies有以下的列:

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

Cookie创建步骤:

  1. 成功登录后,在数据库中创建一个唯一的ID下的cookie记录。您可以使用$ token = uniqid($ user_id,TRUE)和$ salt = md5(mt_rand())来生成hash_hmac('sha512',$ token,$ salt)。
  2. 在数据库中存储'用户ID','过期时间'和'salt'以及'cookie id'。
  3. 在cookie中存储'cookie id'和'token'。

认证步骤:

  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登录中查看信用卡信息。调用密码登录并在会话中添加一个标志以允许所有的前进操作。
+0

在这种情况下,什么阻止人们使用其他人的Cookie进入他们的账户? – 2012-03-27 17:00:43

+1

在此方案中,每次用户访问具有过期会话的网站时,都会生成一个新的Cookie。因此,cookie值经常发生变化,攻击者很难在正确的攻击窗口内访问该站点。换句话说,在XSS攻击成功后,攻击者必须在20分钟内登录。 – mellamokb 2012-03-27 17:07:14