使用php和mysql实现的登录/注册系统

9
我想使用PHP和mysql创建一个简单的用户登录/注册系统。我只需要获取用户登录和注销所需的信息,确保该系统是安全的。
我目前理解的工作方式如下:
注册
用户输入其电子邮件地址和密码以及确认密码。
PHP脚本确保密码匹配,电子邮件地址是有效的并且尚未在数据库中。
它将密码与随机盐一起哈希并将结果存储在数据库中。(php的md5函数是否适用于此?我不太确定这一部分的工作原理。)
在数据库中存储电子邮件确认代码,并向给定的电子邮件地址发送包含该代码的链接以进行验证?
登录
用户输入其电子邮件地址和密码。
服务器查找数据库中的电子邮件并检索盐。然后将盐与用户刚提供的密码哈希以查看是否与数据库中的密码匹配。
如何使会话在登录后持续存在?使用PHP会话还是Cookie?在Cookie中存储什么以记住用户之间的访问?
我基本上只想要一些验证,以确保我描述的过程是一种准确且安全的用户注册/登录方式。此外,有哪些好的教程可提供更多信息。
5个回答

5

PHP的MD5函数适用于这个吗?

MD5已不再被视为安全;考虑使用PHP的新版内置密码哈希和bcrypt算法,该算法具有可变计算复杂度:PHP password_hash()password_verify()

如何在登录后使会话保持?使用PHP会话还是cookie?在cookie中应存储哪些内容以便在访问之间记住用户?

理想情况下,您应该使用PHP会话在单个访问期间维护状态,如果您想要一个“记住我的登录”选项,则应使用包含足够信息以验证返回用户并重新启动新会话的Cookie。这里有一篇关于最佳实践的好文章,讲解了2004年的登录Cookie:持久化登录Cookie最佳实践。您可能还对更现代的(2015年)解决方案感兴趣,用于安全地实现“记住我”复选框
除此之外,我认为您所描述的内容都很好。

我只想补充一下,我在另一个关于哈希部分的问题上找到了一个好答案。https://dev59.com/yHRC5IYBdhLWcg3wJNYN - Mike

4

以下是一些遗漏的注意事项:

PHP会话通常已经使用cookie:会话ID被存储为其中之一。

会话可以被劫持;您还应该采取措施减少可能性(首先阅读《PHP:使用令牌作为cookie防止会话劫持?》和《预防会话劫持的最佳方法是什么?》)。

与劫持相关的是固定,攻击者选择会话ID。有两种对抗方式:设置session.use_only_cookies(PHP >= 5.3的默认值)并在用户登录时更改会话ID使用session_regenerate_id

另请参见问题“PHP会话安全性”和文章“PHP安全指南:会话”。


2
如果你想要一个现成的解决方案, User Cake in php5是一个非常安全稳定的选择。

1
用户蛋糕(UserCake)是否支持使用cookie来实现“记住我”功能? - Scott Yu - builds stuff

1

由于登录系统是网站的重要组成部分,如果它被黑客攻击,你就会很惨。除非你是出于教育目的,否则我建议找一个由有经验的人创建的系统。这样你晚上就可以安心睡觉了。

一个可靠的预先构建的登录系统的例子是tank auth,它是为Code Igniter框架编写的。如果你决定自己编写系统,你可能需要看看这个人是如何设计系统的,以获取关键点的灵感。

还有一点经验之谈,从零开始编写登录系统所需的时间比学习Code Igniter框架和安装tank auth要长得多。


1
这是一个建议:考虑使用一个已经提供此类功能的现成框架。它们经过了尝试和测试。看一下Kohana。它有一个 Auth 模块来处理认证。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接