如何制作一个安全的登录系统


How to make a secure login system

最近我试着喜欢"开发"自己的登录系统。我相信以前已经有人这样做了,但这是对其工作原理的总结。

当然,还有一个"成员"表,其中包含ID、用户名、bcrypt加密密码、电子邮件和其他数据。

其次,还有另一个名为"会话"的数据库,它包含自定义会话哈希和用户ID。

现在,当有人登录时,在完成所有检查后,脚本将生成一个32个字符长的唯一哈希,并将其存储在用户的会话信息中。相同的会话散列将与登录用户的ID一起插入到"会话"数据库中

当它检查会话是否有效时,它会检查数据库中是否存在此会话。如果是,请检查用户的最后一次操作是否超过15分钟。如果是,则会话已过期,并将其从数据库中删除,从而将用户注销。

我想听听你对这个系统的意见,以及我该如何改进它

谢谢!

你可以做很多事情,但你的系统基本上是正确的。我唯一可以建议的是将远程用户的IP地址也存储在会话表中。如果你不这样做,那么你的应用程序将很容易受到会话盗窃的攻击。如果你确保会话哈希总是通过SSL发送,那么问题就小了,但如果不是,有人可能会获得32个字符的会话哈希,并使用它窃取某人的会话,并在不登录的情况下访问系统。

因此,您需要检查以确保在会话表中检查有效会话时,还需要检查ip地址是否仍然匹配。唯一的好处是,对于一些有效用户来说,他们的ip地址可能会在会话过程中更改,从而在他们做某些事情时将他们注销。如今,随着宽带越来越普及,这已经不是什么问题了。

我假设您使用的是SQL数据库。。。

只要您正在进行所有基本的安全检查,例如转义用户输入和存储上次使用的IP地址,这个系统似乎应该是可以的。如果IP在会话过程中发生更改,则可能发生了可疑的情况,因此请注销用户或强制他们重新进行身份验证。

您可以做的最重要的事情之一是至少在登录时尽可能多次地更改SessionID。散列必须是非常非常随机的。

另一种保护机制是,当用户键入他/她的密码三次错误时,将其锁定例如10分钟。