还记得我最好的Cookie吗?

its*_*sme 20 security cookies session-cookies

我读到关于这个论点许多老问题,我认为最好的做法是设置了一个cookie username,user_id并随机令牌.

在创建cookie时,相同cookie的数据存储在DB中,当用户拥有cookie时,它们将被比较(cookie数据,DB数据).

如果这是真正的最佳实践,我真的无法理解安全逻辑在哪里.

窃取cookie的攻击者与原始用户具有相同的cookie:|

忘了一步?:P

Dan*_*s89 52

你永远不应该在cookie中存储用户密码,即使它已被哈希!

看看这篇博客文章:

引用:

  1. 当用户使用"记住我"选中成功登录时,除了标准会话管理cookie之外,还会发出登录cookie.[2]
  2. 登录cookie包含用户的用户名,系列标识符和令牌.系列和令牌是来自适当大空间的不可取的随机数.这三个都存储在数据库表中.
  3. 当未登录的用户访问该站点并显示登录cookie时,将在数据库中查找用户名,系列和令牌.
  4. 如果存在三元组,则认为用户已通过身份验证.使用的令牌将从数据库中删除.生成新令牌,使用用户名和相同的系列标识符存储在数据库中,并向用户发出包含所有三个的新登录cookie.
  5. 如果存在用户名和系列但令牌不匹配,则假定盗窃.用户收到强烈警告的警告,并删除所有用户记住的会话.
  6. 如果用户名和系列不存在,则忽略登录cookie.

  • 我假设令牌只是一个长的、随机生成的字母数字字符串。但是这个系列是什么?我不确定我是否理解该值的性质。用户名 + 令牌还不够吗?您链接的文章不再存在:-( (2认同)

ta.*_*.is 20

user_id除了用户的密码之外,您还应该存储并发出随机令牌.使用cookie中的令牌并在密码更改时更改令牌.这样,如果用户更改了密码,则cookie将无效.

如果cookie被劫持,这很重要.如果用户检测到劫持,它将无效,此外,因为令牌与劫持者无法导出的密码无关,然后更改用户的帐户密码并"拥有"该帐户(假设您需要现有密码)在更改密码之前,劫持者不拥有电子邮件帐户,因此他们不能使用"忘记我的密码"等.

注意令牌不容易被猜测(即它们应该由完全随机的数据组成,例如来自CRNG).

如果您想更进一步,可以在发送之前对cookie进行加密,并在收到后对其进行解密.除此之外,不要假设劫持者不知道所使用的加密密钥,因此在解密时验证cookie的内容.

但所有这一切,更喜欢使用库的持久会话管理,而不是滚动自己的.

  • 当然.但是你提出的建议意味着暴露密码哈希,黑客花费大量时间试图访问,因为你不仅暴露任何旧的哈希,你暴露存储在服务器上的相同哈希用于验证. (5认同)
  • 如果用户更改密码,您可以轻松地使随机令牌无效,这是一个不好的理由. (2认同)

nob*_*ody 5

我什至不会将用户名存储在 cookie 中,只是用几乎不可能破解的技术生成的随机令牌并将其映射到数据库中的用户,并且永远不会存储用户的密码,即使是散列在 cookie 中,它将向蛮力攻击。是的,如果有人窃取了令牌,他可以访问用户的帐户,但密码不会被泄露,并且一旦真正的用户注销,令牌就会失效。另请记住,您不应允许敏感任务,例如为只有有效令牌的用户更改密码,您需要再次请求密码才能执行此类任务。