12

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

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

我的登录系统使用会话来跟踪当前用户 ID,并使用 1/0 进行快速登录/注销检查。用户无法编辑会话 AFAIK,因此这是安全的(如果不是,请告诉我)。我正在考虑将会话 ID 存储在 cookie 中,以便稍后恢复它,但这也不安全。

我非常关心用户的安全,我怎样才能在保持网站正常运行的同时正确保护他们的信息?

4

4 回答 4

11

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

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

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

由于您处于不安全的通道上,因此通常的规则始终适用:使用 HTTPS,否则位于您的计算机和服务器之间的任何人都可以窃取 cookie(会话之一或记住我的)并像您一样行事。

奖金,杰夫阿特伍德必读

于 2013-01-02T23:37:14.280 回答
2

切勿在客户端以任何方式保存密码(可用于登录的加密密码仍然是密码)。

使用随机生成的密钥,安全地存储在服务器上。这些密钥可以在以后撤销,这与加密密码不同,加密密码在更改之前一直有效。

使用 php 你可以像这样生成随机密钥md5(uniqid(mt_rand(), true))。为了更好的安全存储,它在数据库中加盐和散列。

示例表:

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

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

于 2013-01-03T00:17:34.660 回答
0

如果您希望它安全,请不要让您的用户保持登录状态。

设置会话时,一定要把ipaddress绑定到会话ID上,这样以后如果有人接了会话,只能从同一个IP地址进行。你可以通过使用(散列)会话 ID + 散列 IP 地址来保存数据库来做到这一点。我使用 phps 函数http://php.net/manual/en/class.sessionhandler.php来设置会话处理程序并将会话与 ipaddresses 匹配。

于 2013-01-02T23:40:53.257 回答
-3

我在自己的网站上工作时遇到了同样的问题,我发现解决它的最佳方法是根本不记住密码,只记住用户名,提供更快的登录,但不会降低安全性。事实是,没有可靠的方法来保证密码的绝对安全。除了使用新浏览器外,用户还可以让他们的浏览器记住它。

但是,如果您必须保存密码,请尝试以下操作:

拥有多个 cookie,其中 2 个是最简单的,一个用于加密密码,另一个用于保存加密密钥。数据库中的密码将包含一个进一步加密的密码,通过使用您存储的加密密钥获得。当您准备好检查密码时,提取值并加密密码。

希望这会有所帮助。祝你好运!

编辑:我可能误解了这一点,如果用户仍然登录,最好存储会话变量。

于 2013-01-02T23:37:07.270 回答