“记住我”功能的最佳实践?

时间:2011-05-12 09:05:45

标签: php mysql session login

作为我正在开展的大型项目的一部分,我们希望在用户登录过程中集成“记住我”功能。首席开发人员的一个建议就是将他们的PHP session_id()存储在cookie中以及数据库中的记录中。当他们下次访问该站点时,从cookie中查找session_id并检索他们的凭据。

这适用于基于一台计算机的用户,但却违背了云计算(它是一个Web应用程序),用户可能会从不同的计算机访问该网站,并且可能希望选择记住他的详细信息。商场。例如,在一台计算机上设置其session_id,然后在另一台计算机上重新设置它意味着它们将从第一台计算机中注销。

我倾向于向团队建议我们创建一个具有以下结构的单独数据库表:

+----------------+----------------+------------------+--------------------+
|    user_id     |   session_id   |    ip_address    | initial_login_date |
+----------------+----------------+------------------+--------------------+
|       5        |  123456789101  |   192.168.0.1    |     1305194639     |
+----------------+----------------+------------------+--------------------+
|       5        |  021456789101  | 255.255.255.255  |     1305194639     |
+----------------+----------------+------------------+--------------------+

我们需要做的就是在表中查找session_id,然后获取user_id。

有没有更好的方法来实现这一目标?

5 个答案:

答案 0 :(得分:5)

This文章给了我很多帮助

答案 1 :(得分:2)

我想我会在cookie中存储一个唯一的标识符,并使用它代替ip,因为它可能会发生变化。

答案 2 :(得分:2)

首先:您需要知道,拥有此类功能会为攻击者创建比常规会话更大的时间窗口。因为会话意味着很短(几分钟/小时),而这样的记住我功能通常是长期有效的(几天,几周甚至几个月)。

对此的攻击类似于会话攻击,其中攻击者的目标是有效的标识符,该标识符不仅用于标识,还用于身份验证。这就是为什么你应该考虑一个被记住的用户是否应该拥有与经过身份验证的用户不同的权限。

如果要实现此类功能,请不要使用原始身份验证凭据,而是使用随机且唯一的令牌来标识用户和计算机并将其存储在服务器上。您还应确保用户可以控制所有登录会话并记住我令牌,以便他/她可以撤销此类会话/ 在必要时记住我令牌。< / p>

答案 3 :(得分:1)

为每台计算机的用户存储多个持久会话ID没有任何问题。如果您存储“最后一个活动时间戳”以帮助禁止同时使用不同计算机上的同一帐户,可能会更好。

始终为持久性cookie登录使用特殊标志,并为关键功能请求实际登录,例如更改密码等。

此外,每次用户登录您的网站时都会更新持久性Cookie,作为额外的安全措施。

如果IP不匹配,我还支持存储IP并禁止持久登录。最好不要自动登录用户而不是被破解的网站。

答案 4 :(得分:0)

关于coookies的想法是你可以实现AFAIK的最佳方法之一。

第二个想法是使用例如BlowFish algorigthm。因此,您将序列化用户数组并传递然后通过BlowFish算法对其进行加密。如果您的用户进入您的网站,您将从他那里获取cookie并用您的河豚秘密解密,然后将其反序列化,然后检查用户名和密码,但它不像session_id方法那么安全。