PHP“记住我”的安全漏洞?

我正在编写一个“记住我”的登录表单,到目前为止,我阅读的教程(部分是为了确保我正确地做到了这一点)都表示将加密密码存储在cookie中与用户名。 然后,每次PHP检查当前用户是否未登录时,检查他们的cookie并查找这些值。 如果用户名与密码匹配,则表示您已经进入。

对我来说,这是一个巨大的安全漏洞。 如果有人要破解数据库或以某种方式访问​​加密密码,他们甚至不需要破解它们。 只需设置你自己的cookies并去。 我是正确的,还是只是偏执?

我的登录系统使用会话来跟踪当前的用户ID,1/0用于快速登录/注销检查。 用户不能编辑会话AFAIK,所以这是安全的(如果不是,请让我知道)。 我正在考虑将会话ID存储在cookie中,以便稍后恢复,但这也不安全。

我非常关心用户的安全问题,我如何在保持正常运行的网站的同时妥善保护他们的信息?


通常,当服务器被请求记住用户时,它会在正常的会话cookie旁边发出一个额外的cookie,并且这个新的字符串包含用户名和合理数量的随机字符,这使得它无法猜测。 这显然保存在数据库中(出于安全原因,您可能希望将其当作密码对待,并因此将其作为哈希值加以散列),并且下次用户使用同一浏览器进行连接时(假设旧会话已过期),应用程序将收到随机字符串,检查数据库,如果有匹配的用户进行身份验证。

另一种方法是将会话到期时间提前一些。

这里有什么安全漏洞? 假设您使用了一个好的随机生成器,唯一可能发生的事情是用户从共享浏览器访问应用程序,并且在结束时不会手动注销。

正常的规则总是适用,因为你在不安全的频道上:使用HTTPS,否则坐在你的计算机和服务器之间的人可以窃取cookie(会话一或记住我),并且就像你是一样。

奖金,这是Jeff Atwood必读的内容


不要以任何方式保存密码(可用于登录的加密密码仍是密码)。

使用随机生成的密钥,安全存储在服务器上。 这些密钥可以在稍后被撤销,而不像加密的密码,直到更改才有效。

使用PHP,你可以生成像这样的md5(uniqid(mt_rand(), true))随机密钥。 为了更好的安全存储,它在db中被腌制和散列。

示例表格:

login_keys (
  user_id int,
  key char(40), # sha1
  salt char(15)
)

另请注意,您应启用仅HTTP cookie选项。


如果你希望它安全,不要让你的用户保持登录。

在设置会话时,请确保将ipaddress绑定到会话ID,以便稍后有人拿起会话时,只能从相同的IP地址完成会话。 哟可以通过使用(散列)会话ID +散列IP地址来保存数据库。 我使用phps函数http://php.net/manual/en/class.sessionhandler.php来设置会话处理程序并与ipaddresses匹配会话。

链接地址: http://www.djcxy.com/p/21891.html

上一篇: PHP "Remember Me" security flaw?

下一篇: How to securely store access token and secret in Android?