我正在尝试使用此处列出的系统实现“记住我”实用程序:Improved persistent login cookie
然而,这里的逻辑存在问题,并且想知道是否有人可以为我清除这一点。
为用户提供会话ID。这是一个随机生成的字符串 持续超过用户帐户的生命周期。
为用户提供令牌ID。这是一个随机生成的字符串和 每次用户成功登录时都会重新创建。
这两个值都存储为用户计算机和数据库中的签名cookie。
这个想法是,如果有人设法欺骗用户的令牌和系列并以用户身份登录,那么他们将生成新的令牌ID。合法用户下次尝试登录时,他们将拥有匹配的系列但是无效令牌,从而通知系统发生了安全漏洞并且可以采取任何必要的操作(清除用户的令牌)。
这很棒。但是,当用户尝试从多个设备或浏览器使用我的应用程序时会发生什么?假设用户使用Chrome登录我的服务并检查记住我。下次他们通过Firefox登录并选择记住我。将生成一个新令牌,以便下次用户尝试使用Chrome登录时会触发虚假盗窃 - 不是吗?
如果是这种情况,我该如何更可靠地实施此解决方案?我很清楚基于cookie的授权本质上是不太安全的,并且不允许cookie授权用户执行任何破坏性操作,例如购买。
答案 0 :(得分:6)
“改进的持久登录cookie”所引用的原始帖子(在此处找到:http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/)声明:
Cookie应包含用户的用户名,后跟a 分隔符,后跟一些大的随机数(128位 似乎令人难以置信的大到可以接受)。服务器保持 数字 - >用户名关联表,查找以进行验证 cookie的有效性。如果cookie提供随机数和 在表中相互映射的用户名,登录名是 接受。
任何时候,用户名都可能会映射到多个此类数字
因此,用户可以同时拥有许多持久性令牌。