在PHP中,我应该使用什么进行用户认证?

8
我在考虑编写自己的身份验证脚本,但我对安全方面了解不多。
从我阅读的文章来看,这通常涉及使用盐哈希密码并将其存储在数据库中。然后当用户请求登录时,密码被哈希并与数据库进行比较。如果匹配,则用户的数据存储在$_SESSION中。
然而,我不知道这是否安全。我读到有关将会话密钥存储在数据库中的内容,但我不确定它是如何工作的,或者如何实现它。
有人能解释一下如何实现安全的身份验证吗?
此外,有没有PHP身份验证库的建议可以集成,这些库易于学习,而不是编写自己的?

2
请先阅读这篇优秀的总结:PHP密码的安全哈希和盐 - Xyz
1
尽可能重用现有的身份验证框架,因为它确实很复杂。例如,请查看 https://github.com/delight-im/PHP-Auth,它既与框架无关,也与数据库无关。 - caw
3个回答

6
需要注意的事项:
  1. 认证; 验证用户是否是他们所说的那个人。
  2. 授权; 确保用户有权进行他们正在尝试的操作。
  3. 会计; 记录和审计他们的操作。
对于认证,您需要跟踪连接到系统并(通常)用系统进行身份验证的“用户”。这需要知道标识符(用户名、电子邮件或其他唯一令牌)和密码。将用户名和密码存储在某处,但切勿在未确保其安全性的情况下存储密码:不要使用消息摘要算法(如MD5或SHA1)与盐。请改用bcrypt。虽然在此处使用框架不是坏主意,但不要总是依赖框架来执行正确的操作。
对于授权,您需要跟踪用户正在执行的操作,并执行权限检查以查看他们是否被允许执行他们正在尝试的操作。这可以通过多种不同的方式实现,所有这些方式都是特定于领域的-您不会经常找到一个干净利落的例子,尽管您可以找到大量的框架来帮助您。
对于会计,您需要记录用户的操作。这是任何应用程序中最常被忽略的部分,但当发生坏事时,这是非常关键的知识,从web服务器访问日志重建它是一场噩梦。同样,这是特定于领域的,但一个很好的框架应该可以轻松实现它。
最后,将所有三个绑定在一起的是用户的会话。当您在PHP中调用'session_start()'时,它会将会话标识符作为cookie发送到客户端,并将一个文件存储到服务器硬盘上,其中包含该用户的 $ _SESSION 的内容。您还可以配置PHP覆盖默认功能并使用session_set_save_handler保存会话数据。然后,您可以将该信息存储到数据库中。 TL;DR: 使用CodeIgniter、Drupal、Yii或其他活跃开发的解决方案等框架。绝大多数框架都可以满足您的需求,如果不能,它们可以很容易地进行修改。 不要为此创建自己的框架;使用已经提供的框架。

6

请查看此处的答案

尽管这个答案已经有3年的历史了,但建议使用的phpass库是最新的。

此外,顶Arong Cederholm。密码安全是一个广泛的主题,你应该先查看StackOverflow上已经讨论过的相关问题,这样你就能更熟悉该主题和最佳安全实践。

虽然我喜欢框架(SymfonyZend等),因为它们通常会实现这些良好的实践,但仅仅使用它们并不能使你成为一个优秀的程序员。你必须学习它们的内部工作原理。我总是对那些试图开发自己安全认证机制的程序员表示敬意(只要他们不将其实施在真正需要强大安全性的网站上),因为这是了解并理解该主题内部的最佳方法。始终从现有的实现开始,然后使用它作为创建自己代码库的示例。


Zend实际上有一个糟糕的Auth模块,其中包含不安全的示例。 - Jacco

1

我使用 tank_auth(一个 Codeigniter 插件),它非常不错。源代码是实现安全登录的良好参考。


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