对网站实施“记住我”的最佳方法是什么?[关闭]


510

我希望我的网站上有一个复选框,用户可以单击它,这样他们每次访问我的网站时都不必登录。我知道我需要在他们的计算机上存储cookie才能实现此目的,但是该cookie中应包含什么?

另外,是否有一些常见的错误需要提防,以防止此Cookie出现安全漏洞,而在仍然提供“记住我”功能的情况下可以避免该错误?


5
检查stackoverflow.com/questions/549/…(最佳答案的第二部分)
Frosty Z

如果您使用的是ASP.NET,请查看codeproject.com/Articles/779844/Remember-Me
Believe2014 2014年

1
有过在安全SE〜一些非常有用的信息security.stackexchange.com/questions/19676/...
b1nary.atr0phy

splattne当前接受的答案过于复杂。从随机来源创建一个+16字节的令牌,对其进行哈希处理,然后将哈希+帐户ID保存在数据库中。然后以HTTPS + httpOnly cookie(因此Javascript无法访问/窃取)将令牌发送给用户(base64编码)。这样,没有人能猜出令牌或以无效的猜测使人们登出,但是即使您的数据库被黑客入侵,也没有人可以使用数据库中的令牌(它们是经过哈希处理的)。因此,只有原始客户端(或以某种方式从浏览器商店窃取令牌的人)才能使用它。
Xeoncross

Answers:


536

改进的持久登录Cookie最佳做法

您可以使用此处描述为最佳实践的策略(2006)或此处描述的更新策略(2015):

  1. 当用户在选中“记住我”的情况下成功登录时,除了标准会话管理cookie外,还会发出一个登录 cookie。
  2. 登录cookie包含系列标识符和令牌。系列和令牌是来自适当大空间的不可猜测的随机数。两者都存储在数据库表中,令牌被散列(sha256可以)。
  3. 当非登录用户访问站点并显示登录cookie时,将在数据库中查找系列标识符。
    1. 如果存在系列标识符,并且令牌的哈希与该系列标识符的哈希匹配,则认为用户已通过身份验证。生成一个新令牌,该令牌的新哈希存储在旧记录上,并向用户发布一个新的登录cookie(可以重新使用系列标识符)。
    2. 如果存在该系列但令牌不匹配,则认为是盗窃。用户收到措辞强烈的警告,并且删除了用户记住的所有会话。
    3. 如果用户名和系列不存在,则登录cookie被忽略

这种方法提供了深度防御。如果有人设法泄漏数据库表,它就不会给攻击者打开冒充用户的门户。


20
另见:stackoverflow.com/questions/549/...你不应该读“改良”版本
Jacco

8
这样做的问题是,尽管Gmail就是这样做的,但您在cookie中公开了用户名。为什么同时需要系列ID和令牌?更大的令牌会好吗?
丹·罗森斯塔克

10
同样,关于此模型,它可以防止攻击者窃取并将cookie放置在他的计算机上并从被入侵的计算机中删除cookie。而不需要在被黑客入侵的计算机未知的情况下根据需要对他的计算机进行身份验证和更新?唯一的变化是被黑客入侵的计算机用户将不得不再次登录并设置为“记住我”。被黑用户是否意识到这一点尚不确定。

24
@HiroProtagonist系列标识符用于防止DoS攻击。没有它,我可以快速编写一个脚本,用每个用户名和一个无效的令牌访问您的网站,使您网站上的所有人都注销。
克里斯·莫斯奇尼

6
该解决方案是错误的,它不处理并发性:如果两个具有相同的“我记住” cookie的同时到达两个“我记住”身份验证请求,则第一个成功并更改令牌,第二个导致身份验证不成功,并且错误警报(因为令牌已被第一个请求更改)。(这种情况可能在浏览器启动时出现,并且该站点在两个浏览器选项卡中还原。)
slobo 2015年

9

我将存储一个用户ID和一个令牌。当用户返回该站点时,请将这两条信息与诸如数据库条目之类的持久性内容进行比较。

至于安全性,请不要在其中放任何东西,以免有人修改Cookie以获得额外的好处。例如,不要存储其用户组或密码。不能修改任何会破坏您安全性的内容都不应存储在Cookie中。


8

存储他们的UserId和RememberMeToken。当他们使用“记住我”身份登录时,将生成一个新的“ RememberMeToken”(使其他所有标记为“记住我”的计算机无效)。

当他们返回时,请通过“记住我”令牌对其进行查找,并确保UserId匹配。


这可以在几秒钟内强行执行。我将user_id设置为1并强行强制使用所有令牌。它会在几秒钟内为我提供访问权限
朋友

4

我自己调查持久性会话,我发现这根本不值得承担安全风险。如果绝对必要,请使用它,但是您应该考虑仅对这种会话进行弱认证,并对可能对攻击者有价值的任何事情强制进行新的登录。

原因当然是包含持久会话的cookie很容易被盗。

窃取Cookie的4种方法(根据Jens Roland在网页上的评论,@splattne基于他的回答):

  1. 通过不安全的线路拦截(数据包嗅探/会话劫持)
  2. 通过直接访问用户的浏览器(通过恶意软件或对该框的物理访问)
  3. 通过从服务器数据库读取它(可能是SQL Injection,但可以是任何东西)
  4. 通过XSS黑客(或类似的客户端漏洞利用)

104
1. HTTPS旨在防止这种情况。2.保持登录状态不是这里的安全问题,您有更大的问题。3.与2相同。4.可以通过访问控制策略和良好的输入卫生来防止这种情况;如果您不采取这些步骤,那么您将遇到比“保持登录状态”更大的问题。
克里斯·莫斯基尼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.