536

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

此外,是否存在需要注意的常见错误,以防止此 cookie 出现安全漏洞,在仍然提供“记住我”功能的同时可以避免这些错误?

4

4 回答 4

563

改进的持久登录 Cookie 最佳实践

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

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

这种方法提供纵深防御。如果有人设法泄露数据库表,它不会为攻击者提供冒充用户的机会。

于 2008-10-28T21:20:49.473 回答
10

存储他们的 UserId 和 RememberMeToken。当他们使用记住我登录时,检查生成一个新的 RememberMeToken(这会使任何其他标记为记住我的机器无效)。

当他们返回时,通过记住我的令牌查找它们并确保 UserId 匹配。

于 2008-10-28T21:14:25.150 回答
9

我会存储一个用户 ID 和一个令牌。当用户返回站点时,将这两条信息与数据库条目等持久性信息进行比较。

至于安全性,请不要在其中放置任何允许某人修改 cookie 以获得额外好处的东西。例如,不要存储他们的用户组或密码。任何可以修改的会绕过您的安全性的内容都不应存储在 cookie 中。

于 2008-10-28T21:17:53.427 回答
4

我自己调查持久会话我发现它根本不值得冒安全风险。如果您绝对必须使用它,但您应该考虑这样的会话仅经过弱身份验证,并强制新登录以获取任何可能对攻击者有价值的内容。

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

窃取 cookie 的 4 种方法(来自Jens Roland在页面上@splattne基于他的回答的评论):

  1. 通过不安全的线路拦截它(数据包嗅探/会话劫持)
  2. 通过直接访问用户的浏览器(通过恶意软件或对盒子的物理访问)
  3. 通过从服务器数据库中读取它(可能是 SQL 注入,但也可以是任何东西)
  4. 通过 XSS hack(或类似的客户端漏洞利用)
于 2009-02-21T10:17:58.020 回答