实现“记住我”的最好方法是什么?对于一个网站?

我想我的网站有一个复选框,用户可以点击,这样他们就不必每次访问我的网站时登录。我知道我需要在他们的电脑上存储一个cookie来实现这个功能,但是这个cookie应该包含什么呢?

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

320332 次浏览

存储他们的UserId和一个RememberMeToken。当他们登录时,“记住我”勾选生成一个新的“记住我”令牌(使任何其他标记为“记住我”的机器无效)。

当它们返回时,通过remember me令牌查找它们并确保UserId匹配。

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

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

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

你可以使用这里是最佳实践(2006)或这里描述了一个更新的策略(2015)描述的策略:

  1. 当用户成功登录并选中Remember Me时,除了标准会话管理cookie之外,还有发出登录cookie
  2. 登录cookie包含一个序列标识符和一个令牌。级数和令牌是来自适当大空间的无法猜测的随机数。两者都存储在一个数据库表令牌是散列的 (sha256就可以了)中。
  3. 当非登录用户访问站点并提供登录cookie时,系列标识符为查了一下数据库
    1. 如果存在序列标识符并且令牌的散列与该系列标识符的散列匹配,则认为该用户为通过身份验证。生成新令牌,令牌的新散列存储在旧记录上,并向用户发出新的登录cookie(可以重用序列标识符)。
    2. 如果序列存在,但令牌不匹配,则假定是盗窃。用户会收到一个措辞强烈的警告,并且删除所有用户记住的会话。
    3. 如果用户名和系列不存在,登录cookie是忽略了
    4. 李< / ol > < / >

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

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

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

4种窃取你的cookie的方法(来自延斯·罗兰的评论页面的@splattne,基于他的答案):

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