记住我 Cookie 的最佳实践?
记住我cookie最佳实践
在实现“记住我”功能时,我们通常会使用cookie来存储用户的登录凭证,以便在用户下次访问网站时自动登录。然而,不正确地处理这些cookie可能会导致安全问题。本文将讨论出现这些问题的原因以及解决方法。
问题的原因是在cookie中存储了敏感信息,比如用户名和密码。这样做会增加密码被暴力破解攻击的风险。即使密码经过哈希处理,攻击者仍然有可能通过暴力破解攻击来获取原始密码。因此,将密码存储在cookie中是不安全的。
解决这个问题的方法是使用一个难以破解的技术生成一个随机的令牌,并将其与用户在数据库中的关联进行映射。在cookie中存储这个令牌,而不是用户名或密码。这样,即使令牌被盗取,攻击者也无法获取用户的密码。而且,一旦真正的用户登出,令牌也会被立即失效。另外,还需要注意的是,不应该允许仅具有有效令牌的用户执行敏感任务,如修改密码。对于这类任务,需要再次要求用户输入密码。
在PHP中,可以使用以下代码生成随机令牌:
$token = bin2hex(random_bytes(32));
通过将这个令牌存储在cookie中,可以实现更安全的“记住我”功能。
总之,为了保护用户的登录凭证安全,在实现“记住我”功能时,应避免在cookie中存储敏感信息,如用户名和密码。相反,应该使用难以破解的技术生成随机令牌,并将其与用户在数据库中的关联进行映射。这样可以提高系统的安全性,避免密码被暴力破解攻击。
记住我Cookie最佳实践
在开发中,我们常常需要使用Cookie来实现用户的记住登录功能。然而,如果我们不小心处理Cookie,可能会导致安全漏洞,使得用户的账户被黑客攻击。为了解决这个问题,我们需要采取一些措施来确保记住我Cookie的安全性。
首先,我们应该存储用户的user_id
,并发放一个随机的令牌(token),除了用户的密码。我们将令牌(token)放在Cookie中,当用户更改密码时,我们也要更改令牌(token)。这样,如果用户更改了密码,那么Cookie将会失效。
这一点非常重要,如果Cookie被劫持了,用户可以检测到劫持,并使Cookie失效。此外,由于令牌(token)与密码无关,黑客将无法推导出并更改用户的账户密码,从而"拥有"该账户(假设在更改密码之前需要输入现有密码,黑客并不拥有邮箱账户,因此无法使用"忘记密码"等功能)。
需要注意的是,令牌(token)不能容易地被猜测出来(即应由完全随机的数据组成,例如来自密码学安全的随机数发生器(CRNG))。
如果想再进一步加强安全性,可以在发送Cookie之前对其进行加密,在接收时进行解密。此外,不要假设黑客不知道所使用的加密密钥,因此在解密时要对Cookie的内容进行验证。
然而,尽量使用库的持久性会话管理,而不是自己开发的方式。
如果用户更改密码,可以很容易地使令牌(token)失效,所以这并不是一个很好的理由。
但是,你是否需要跟踪发放的令牌(token)呢?
当然。但是,你提出的方法意味着暴露密码的哈希值,黑客会花费大量时间试图获取对其的访问权限,因为你暴露的不仅仅是任意的哈希值,而是与服务器上用于验证的哈希值相同。
我同意。Danielss89给出的答案是最好的,里面包含了Jaspan的文章链接。
记住我Cookie最佳实践
在下面的内容中,我们可以看到关于记住我Cookie的最佳实践的问题出现的原因以及解决方法。
问题出现的原因:
- 有人问到为什么需要在记住我Cookie中存储系列(series)的值,因为用户名和令牌(token)似乎已经足够了。
- 有人担心如果将用户名和系列存储在Cookie中,是否会导致用户在多个浏览器上无法实现自动登录。
解决方法:
- 系列(series)的值用于通知合法用户当前有效的令牌(token)已被其他人使用。当系统生成一个新的令牌时,会发送一个包含系列和令牌的Cookie给合法用户。如果其他人窃取了之前的令牌并使用它,系统可以通过系列值来判断合法用户正在使用已被其他人使用过的令牌。
- 为了避免在合法用户发送连续的请求时出现错误,可以考虑在每次请求之后的5秒内更新会话ID,而不是每次请求都更新。
- 不需要将用户名存储在Cookie中,可以将其他指向用户名的随机字符串放入Cookie中。
- 为了防止有人通过猜测大量随机用户名和系列来登录网站上的所有用户,可以采取其他安全措施。
这些解决方法可以帮助开发者更安全地实现记住我Cookie功能,并提供更好的用户体验。