为网站实现“记住我”的最佳方法是什么?

时间:2008-10-28 21:09:15

标签: security cookies remember-me

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

此外,是否存在常见错误,需要注意保持此Cookie不会出现安全漏洞,这可以在仍然提供“记住我”功能时避免使用?

4 个答案:

答案 0 :(得分:511)

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

您可以使用here as best practice(2006)或an updated strategy described here(2015)所述的策略:

  1. 当用户成功登录并选中记住我时,除标准会话管理cookie外,还会发出登录cookie
  2. 登录Cookie包含系列标识符和令牌。系列和令牌是来自适当大空间的不可取的随机数。两者都存储在数据库表中,令牌被哈希(sha256很好)。
  3. 当未登录的用户访问该站点并显示登录cookie时,系列标识符在数据库中查找
    1. 如果系列标识符存在且标记的哈希值与该系列标识符的哈希值匹配,则该用户将被视为已验证身份。生成新令牌,令牌的新哈希存储在旧记录上,并向用户发出新的登录cookie(可以重新使用系列标识符< /强>)。
    2. 如果系列存在但令牌不匹配,则假定盗窃。用户收到强烈警告的警告,并删除所有用户记住的会话。
    3. 如果用户名和系列不存在,则登录Cookie 忽略
  4. 这种方法提供了纵深防御。如果有人设法泄漏数据库表,它不会给攻击者一个模仿用户的门。

答案 1 :(得分:9)

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

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

答案 2 :(得分:7)

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

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

答案 3 :(得分:4)

我自己调查持续会话我发现它根本不值得冒安全风险。如果你绝对必须使用它,但是你应该认为这样的会话只是经过了微弱的身份验证,并强制重新登录任何可能对攻击者有价值的东西。

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

4种窃取Cookie的方法(根据@splattne {{1}}根据其答案):

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