7

我正在尝试使用此处概述的系统实现“记住我”实用程序:改进的持久登录 cookie

但是,对我来说这里的逻辑存在问题,并且想知道是否有人可以为我解决这个问题。

  • 给用户一个会话 ID。这是一个随机生成的字符串,并且在用户帐户的整个生命周期内都是持久的。

  • 给用户一个令牌 ID。这是一个随机生成的字符串,每次用户成功登录时都会重新创建。

这两个值都作为签名 cookie 存储在用户机器和数据库中。

这个想法是,如果有人设法欺骗用户的令牌和系列并以用户身份登录,那么他们将生成一个新的令牌 ID。下次合法用户尝试登录时,他们将有一个匹配的系列但一个无效的令牌,从而通知系统发生了安全漏洞并且可以采取任何必要的措施(清除用户的令牌)。

这很棒。但是,当用户尝试从多个设备或浏览器使用我的应用程序时会发生什么?假设用户使用 Chrome 登录我的服务并检查记住我。下次他们通过 Firefox 登录并选择记住我时。将生成一个新令牌,以便用户下次尝试使用 Chrome 登录时会触发虚假盗窃 - 不是吗?

如果是这种情况,我怎样才能更可靠地实施这个解决方案?我很清楚基于 cookie 的授权本质上不太安全,并且不允许 cookie 授权用户执行任何破坏性操作,例如购买。

4

1 回答 1

7

“改进的持久登录 cookie”所指的原始帖子(可在此处找到:http: //fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/)指出:

cookie 应该包含用户的用户名,后跟一个分隔符,然后是一些大的随机数(128 位似乎大到可以接受)。服务器保留一个数字->用户名关联表,查找该表以验证 cookie 的有效性。如果 cookie 提供在表中相互映射的随机数和用户名,则接受登录。

在任何时候,一个用户名都可以映射到几个这样的数字

因此,用户可以同时拥有多个持久性令牌。

于 2013-09-22T13:03:49.570 回答