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

9
作为我正在开展的一个大型项目的一部分,我们正在寻求在用户登录过程中集成“记住我”功能。首席开发人员的建议是简单地将其PHP session_id()存储在cookie和数据库中的记录中。当他们下次访问网站时,从cookie中查找session_id并检索他们的凭据。
这对于基于一台计算机的用户来说非常好用,但与云计算(它是一个Web应用程序)相悖,用户可能会从不同的计算机访问该网站,并可能希望在所有计算机上都记住他的详细信息。例如,在一台机器上设置其session_id,然后在另一台机器上重新设置其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即可。
有更好的方法实现这个吗?

由于代理、AOL、黑帽等因素的存在,使用IP地址来识别用户是一个不好的想法。然而,我对最佳实践感兴趣。 - trickwallett
抱歉,我应该更清楚地表达。我们不使用IP地址来识别用户 - 这就是为什么有session_id字段的原因。IP地址用于某些内部管理系统 - 而不是实际的登录功能或用户识别。 - BenM
5个回答

5

This article helped me a lot


同意 - 本文描述了高级网站上所见到的行为,特别是反社交工程实践,“哦,你想更改用户详细信息?你的密码是什么来着?” - Gavin C

2

我认为我应该在cookie中存储一个唯一标识符,并使用它来代替IP地址,因为IP地址可能会发生变化。


2
首先,您需要知道,拥有这样一个功能比普通会话创建了更长的时间窗口,使攻击者有更多的时间来攻击。因为会话通常只是短暂的(几分钟/小时),而“记住我”功能通常有效期很长(数天、数周甚至数月)。
对此进行攻击类似于会话攻击,攻击者旨在获取有效标识符,该标识符不仅用于识别还用于身份验证。这就是为什么您应该考虑是否应该给予记住用户与常规认证用户不同的特权。
如果您想实现这样一个功能,请不要使用原始的身份验证凭据,而是使用随机和唯一的令牌来识别用户和计算机,并将其存储在服务器上。您还应确保用户控制所有登录会话和“记住我”令牌,以便在必要时可以撤销这些会话/“记住我”令牌。

1

在一个计算机上为一个用户存储多个持久会话 ID 并没有什么问题。如果您存储一个“最后活动时间戳”,可以帮助防止同一账户在不同的计算机上同时使用。

对于持久 cookie 登录,始终使用特殊标志,并要求进行真实登录以执行关键功能,例如更改密码等。

此外,每次用户登录到您的网站时,请更新持久 cookie 作为额外的安全措施。

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


0

关于Cookie的想法是我所知道的最好的之一。

第二个想法是例如使用BlowFish算法。因此,您将序列化用户和密码的数组,然后使用BlowFish算法进行加密。如果您的用户在您的站点上输入,您将从他那里获取Cookie,并使用来自您的BlowFish的秘密进行解密,反序列化它,然后检查用户名和密码,但与session_id方法相比,它并不是非常安全。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接