我正在编写一个“记住我”的登录表单,到目前为止我读过的教程(部分是为了确保我做得对)都说要将加密的密码存储在一个cookie以及用户名。然后,每次PHP检查当前用户是否未登录时,请检查其cookie并查找这些值。如果用户名与密码匹配,则表示您已进入。
对我而言,这是一个巨大的安全漏洞。如果有人要破解数据库或以某种方式访问加密密码,他们甚至不需要破解它们。只需设置自己的cookie即可。我是正确的,还是只是偏执狂?
我的登录系统使用会话来跟踪当前用户ID,并使用1/0进行快速登录/注销检查。用户无法编辑会话AFAIK,因此这是安全的(如果不是,请告诉我)。我只想将会话ID存储在cookie中,以后再恢复它,但这也不安全。
我非常关心用户的安全性,如何在保持功能正常的网站的同时妥善保护他们的信息呢?
答案 0 :(得分:11)
通常,当要求服务器记住用户时,它会在普通会话cookie旁边发出一个额外的cookie,这个新字符串包含用户名和合理的金额随机字符使其不可思议。这显然保存在数据库中(出于安全原因,您可能希望将其视为密码,因此对其进行加密和哈希处理),并且下次用户使用同一浏览器连接时(假设旧会话已过期),应用程序将收到随机字符串,检查数据库,如果匹配,则验证用户。
另一种方法是将会话到期时间提前一段时间。
这里有哪些安全漏洞?如果您使用一个好的随机生成器,唯一可能发生的事情是用户从共享浏览器访问该应用程序,并且在结束时不会手动注销。
正常规则始终适用,因为您处于不安全的渠道:使用HTTPS,否则坐在您的计算机和服务器之间的任何人都可以窃取Cookie(会话一或记住-me 一个)并且好像是你一样。
答案 1 :(得分:2)
永远不要以任何方式保存密码(可用于登录的加密密码仍然是密码)。
使用随机生成的密钥,安全地存储在服务器上。与加密密码不同,这些密钥可以在以后撤销。密码在更改之前有效。
使用php,您可以生成像md5(uniqid(mt_rand(), true))
这样的随机密钥。为了更好的安全存储,它在数据库中进行盐渍和散列。
示例表:
login_keys (
user_id int,
key char(40), # sha1
salt char(15)
)
另请注意,您应启用仅HTTP Cookie 选项。
答案 2 :(得分:0)
如果您希望它安全,请不要让用户让他们保持登录状态。
设置会话时,请确保将ipaddress绑定到会话ID,这样如果有人稍后选择会话,则只能从同一个IP地址完成。 Yo可以通过使用(哈希)会话ID +哈希ipaddresses保持数据库来实现此目的。 我使用phps函数http://php.net/manual/en/class.sessionhandler.php来设置会话处理程序并使用ipaddresses匹配会话。
答案 3 :(得分:-3)
我在自己的网站上工作时遇到了同样的问题,我发现解决问题的最好方法就是忘记密码,只记住用户名,提供更快的登录但不是更安全的登录。事实是,没有确定的防火方法来保证密码绝对安全。除了新的浏览器,用户可以让他们的浏览器记住它。
但是如果你必须有一个保存的密码,试试这个:
拥有多个cookie,2个是最简单的,并使用一个加密密码,而另一个加密密钥。数据库中的密码将包含使用存储的加密密钥获得的进一步加密密码。准备好检查密码时,请提取值并加密密码。
希望这有用。祝你好运!
编辑:我可能误解了这一点,如果用户仍然登录,最好存储一个会话变量。