Php 如何建立一个安全的登录系统

Php 如何建立一个安全的登录系统,php,Php,最近我尝试开发自己的登录系统。我相信之前已经有人这样做了,但这是它工作原理的总结 当然,有一个members表,其中包含ID、用户名、bcrypt加密密码、电子邮件和其他数据 其次,还有另一个名为sessions的数据库,它包含一个自定义会话哈希和用户ID 现在,当有人登录时,在完成所有检查之后,脚本将生成一个唯一的32个字符长的散列,并将其存储在用户的会话信息中。相同的会话哈希将与登录用户的ID一起插入会话数据库 当它检查会话是否有效时,它将检查数据库中是否存在此会话。如果是,则检查用户的最后

最近我尝试开发自己的登录系统。我相信之前已经有人这样做了,但这是它工作原理的总结

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

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

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

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

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


谢谢

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


因此,您需要进行检查,以确保在sessions表中检查有效会话时,也检查ip地址是否仍然匹配。唯一的退路是,对于一些有效的用户,他们的IP地址可能会在会话的中间改变,因此在他们做某事时将它们记录出来。现在,随着宽带越来越普及,这个问题就不那么严重了。

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


这个系统看起来应该是正常的,只要你做了所有基本的安全检查,比如转义用户输入,存储最后使用的IP地址。如果IP在会话中间发生变化,可能会发生可疑的事情,所以将用户注销或强迫他们重新认证。

< P>最重要的事情之一是至少在登录时更改SESSID ID的次数。散列必须是非常随机的


另一种保护机制是锁定用户,例如,当用户输入密码错误三次时锁定用户10分钟。

我在帖子中忘了提到这一点,但我已经检查了IP和用户代理是否相同。我应该只使用IP,还是保留用户代理?谢谢,就我的两便士。用户代理是虚构的。黑客企图可以将任何用户代理放入他们想要的位置。然而,越安全越好。检查用户代理不会有什么坏处。我认为最重要的是,你要确保登录请求和会话检查都是通过安全连接进行的。你应该把这个问题和上面的代码一起发布出来。这是一个更合适的地方,这个问题很快就要结束了。是的,我正在使用PDO准备所有语句,然后在数据库上实际执行它们。每次他们登录时,都会生成一个具有新IP地址的新会话哈希。这意味着我总是使用最新的IP地址,对吗?在你的问题中,你说你在用户执行最后一个操作时检查了。无论您在哪里执行此操作,都要添加几行代码来检查IP是否仍然相同。