实现在多个设备上使用令牌和系列记住我

Geo*_*ith 6 security authentication cookies session remember-me

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

然而,这里的逻辑存在问题,并且想知道是否有人可以为我清除这一点.

  • 为用户提供会话ID.这是一个随机生成的字符串,在用户帐户的生命周期内是持久的.

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

这两个值都作为签名cookie存储在用户的计算机和数据库中.

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

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

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

161*_*903 6

"改进的持久登录cookie"所引用的原始帖子(在此处:http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/)指出:

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

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

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