我想使用PHP和mysql创建一个简单的用户登录/注册系统。除了用户登录和退出所需的信息之外,我不需要获取任何信息。我想确保系统安全。
我目前了解它应该如何运作的方式是:
注册
用户输入他们的电子邮件地址和密码以及确认密码。
PHP脚本确保密码匹配,并且电子邮件是有效地址且不在数据库中。
它将密码与随机盐一起散列,并将盐和散列密码存储在数据库中。 (php的md5功能是否适用于此?我不太确定这部分是如何工作的。)
将电子邮件确认代码存储在数据库中,并将指定的电子邮件地址发送回包含该代码的网站以进行验证?
登录
用户输入他们的电子邮件地址和密码。
服务器在数据库中查找电子邮件并检索salt。然后使用用户刚刚提供的密码对salt进行哈希处理,以查看它是否与数据库中的密码相匹配。
登录后如何使会话保持不变。有PHP会话?一块饼干?什么应该存储在cookie中以便在访问之间记住用户?
我基本上只想验证我所描述的过程是一种准确而安全的用户注册/登录方式。另外,有哪些好的教程可以提供更多信息。
答案 0 :(得分:5)
php的md5功能是否适用于此?
MD5不再被认为是安全的;考虑使用PHP的新内置密码散列和bcrypt算法,该算法具有可变的计算复杂度:PHP password_hash()
和password_verify()
。
登录后如何使会话保持不变。用php会话?一块饼干?什么应该存储在cookie中以便在访问之间记住用户?
理想情况下,您将使用PHP会话在单次访问期间维护状态,如果您希望“记住我的登录”选项,您将使用包含足够信息的cookie来验证返回的用户并重新启动一个新的会议。 2004年关于登录cookie的最佳实践有一篇很好的文章:Persistent Login Cookie Best Practice。您可能也对securely implementing "remember me" checkboxes的更现代(2015)解决方案感兴趣。
除此之外,我认为你描述的一切都很好。
答案 1 :(得分:4)
关于一些缺失考虑因素的一些注释:
PHP会话通常已使用cookie:会话ID存储为一个。
会话可能被劫持;您还应采取措施降低可能性(首先阅读“PHP: Preventing Session Hijacking with token stored as a cookie?”和“What is the best way to prevent session hijacking?”。
与劫持相关的是fixing,攻击者在其中挑选会话ID。有两种方法可以解决这个问题:设置session.use_only_cookies(PHP中的默认设置= = 5.3)并在用户使用session_regenerate_id
登录时更改会话ID。
另请参阅问题“PHP Session Security”和文章“PHP Security Guide: Sessions”。
答案 2 :(得分:2)
答案 3 :(得分:1)
由于登录系统是网站不可或缺的一部分,如果被黑客攻击,你就会被搞砸。除非您出于教育目的而这样做,否则我建议您找一个由具有该领域经验的人创建的系统。你晚上睡得很香。
一个可靠的预构建登录系统示例是tank auth,它是为Code Igniter框架编写的。您可能想看看这个人如何设计系统,以便在您决定编写自己的内容时获得有关重要事项的想法。
另外,从经验来看,从头开始编写登录系统需要花费更多时间,而不是学习代码点火器框架和安装tank auth。
答案 4 :(得分:1)
这是一个建议:考虑使用一个本身提供此类功能的现成框架。他们经过了试验和测试。看看Kohana。它有一个Auth模块,负责认证。