“记住我”功能的最佳实践?
Posted
技术标签:
【中文标题】“记住我”功能的最佳实践?【英文标题】:Best practice for 'remember me' functionality? 【发布时间】:2011-08-23 23:02:50 【问题描述】:作为我正在进行的一个更大项目的一部分,我们希望在用户登录过程中集成“记住我”功能。主要开发人员的一个建议是将他们的 php session_id() 简单地存储在 cookie 中,并存储在数据库中的记录中。当他们下次访问该站点时,从 cookie 中查找 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 地址来识别用户是个坏主意。我对最佳实践的样子很感兴趣。 对不起,我应该更清楚。我们没有使用 IP 地址来识别用户 - 这就是 session_id 字段存在的原因。 IP 地址用于某些内部管理系统 - 不是实际的登录功能或用户标识。 【参考方案1】:This的文章对我帮助很大
【讨论】:
同意 - 本文描述了您在高级网站上看到的行为,特别是“哦,您想更改用户详细信息?您的密码又是什么?”的反社会工程实践。 【参考方案2】:我想我会在 cookie 中存储一个唯一标识符,并使用它而不是 ip,因为它可能会发生变化。
【讨论】:
【参考方案3】:首先:您需要知道,拥有这样的功能会为攻击者创建比常规会话更大的时间窗口。因为会话相当短(几分钟/小时),而这种记住我功能通常是长期有效的(几天、几周甚至几个月)。
对此的攻击类似于会话攻击,其中攻击者瞄准一个有效标识符,该标识符不仅用于识别,还用于身份验证。这就是为什么您应该考虑记住的用户是否应该拥有与常规认证用户不同的权限。
如果您想实现这样的功能,请不要使用原始身份验证凭据,而是使用随机且唯一的令牌来识别用户和机器并将其存储在服务器上。您还应该确保用户可以控制所有登录会话和记住我令牌,以便他/她可以在必要时撤销这些会话/记住我令牌。
【讨论】:
【参考方案4】:为每台计算机的用户存储多个持久会话 ID 没有任何问题。如果您存储“上次活动时间戳”以帮助禁止从不同计算机同时使用同一帐户,则可能会更好。
始终为持久 cookie 登录使用特殊标志,并为关键功能(如更改密码等)请求真实登录。
此外,作为一项额外的安全措施,每次用户登录您的网站时更新持久性 cookie。
我还支持存储 IP 并在 IP 不匹配时禁止持久登录。最好不要自动登录用户而不是被破解的站点。
【讨论】:
【参考方案5】:关于 cookie 的想法是您可以实施 AFAIK 的最佳想法之一。
第二个想法是使用例如 BlowFish 算法。因此,您将序列化用户数组并通过 BlowFish 算法对其进行加密。如果您的用户进入您的网站,您将从他那里获取 cookie,并使用河豚的秘密对其进行解密,对其进行反序列化,然后检查用户名和密码,但它不像 session_id 方法那么安全。
【讨论】:
以上是关于“记住我”功能的最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章