PHP login cookies security
在过去关于登录系统"记住我"功能中有关安全性的大多数问题中,建议采用"持久登录Cookie最佳实践"。
如果我理解正确,则此方法如下:
如果用户检查记住密码,则应设置由用户名,后跟分隔符和一些较大的随机数组成的cookie。例如:
$_COOKIE["login"]; ="adam:8794383bb07608636dab808df6c9e29c"
将用户名和哈希字符串存储在数据库中。
如果两个cookie都存在,并且在db中相互映射,则接受登录。
验证后,从cookie中删除随机数,生成一个新数字并存储在cookie中。 (我是否还需要更新数据库中这个新近生成的哈希字符串?)
当用户注销时,当前的cookie编号也会失效。(是否应该从数据库中删除用户名和随机字符串?)
全部吗?
就像我之前的问题一样,我被告知,如果有人可以访问cookie,则他们可以轻松进行身份验证。那么这种方法如何解决该问题呢?
非常感谢。
- 您基本上是在创建会话系统-这不是问题,与问题无关。如果您想记住某人,只需设置一个不确定的cookie到期时间
实际上,这是我的建议。示例数据库架构
用户:
-
用户身份
-
用户名
-
autologin_hash
-
autologin_expire
过程:
用户点击记得我
服务器分配一个唯一的令牌并将其存储在数据库中,并将其作为cookie发送。
服务器还在autologin_expire字段中分配固定的到期日期
检查用户的cookie是否等于其帐户在服务器上存储的cookie,并且该cookie尚未过期
一切都很好...登录,删除哈希,重新生成它,并更新下一次登录的到期日期
您永远不会希望将用户名或密码存储在cookie中,因为如果不使用SSL,它们很容易被盗。使用唯一的哈希并在每次登录时将其清除可解决以下问题:1)防止身份验证详细信息泄漏; 2)使自动登录仅有效一次(不能窃取Cookie并再次使用); 3)强制使用有效期限服务器端,这有助于防止滥用; 4)很难猜到长的唯一ID,因此,黑客实际上必须窃取Cookie才能获得访问权限。
编辑:如果您想要更高的安全性,请在用户更改密码时记下注释以清除哈希值。如果用户由于担心密码泄露而更改了密码,则不希望有效的自动登录哈希值散落。
-
感谢您的回复。为什么要设定到期日?最好在身份验证之后延长到期日期,这样常规访问者就不需要在固定日期之后登录,这就是我在网站上看到的。
-
抱歉...我应该解释得更好。 expire字段用于用户成功登录后创建的新哈希。这样做的理由是您希望限制用户无法更改的服务器。否则,黑客可能会获取有效的哈希并将Cookie的有效期更改为所需的任何日期。确定日期后,"我休假两个星期而忘记注销我的办公计算机"问题就解决了。
4)。您确实需要更新哈希,否则此人将不会自动再次登录。
5)。您应该进行清理,但是如果它无效,则您的代码不应将其视为有效。
关于阻止其他人使用该cookie登录,您可以执行...
-
用户代理也必须完美匹配。
-
登录后,其帐户将标记为已记住登录。当涉及到更改密码,付款时,您再次要求输入密码。
- 感谢您的回复。用户代理不会仅告知有关操作系统和浏览器的信息。如果在具有相同操作系统和浏览器版本的计算机上使用了被盗的cookie,会不会一样?
-
像Amazon这样的大多数网站都遵循这种方法。"记住我" cookie不允许用户执行重要操作(例如结帐),而不要求用户再次登录以证明自己是该人。
-
该系统假定计算机上具有物理安全性...自动登录系统易于启动,并且在高安全性设置中永远不应依赖。
-
@Jay是的,同一个用户代理将不提供任何安全性。找出无法访问您的确切字符串的人,这只是一个简单的技巧。