【问题标题】:What should I use for user authentication in PHP?我应该在 PHP 中使用什么进行用户身份验证?
【发布时间】:2012-03-02 07:58:35
【问题描述】:

我正在考虑编写自己的身份验证脚本,但我对安全性知之甚少。

从我阅读的文章看来,它通常涉及使用盐对密码进行哈希处理并将其存储在数据库中。然后当用户请求登录时,密码被散列并与数据库进行比较。如果匹配,则用户的数据存储在 $_SESSION 中。

但是,我不知道这是否安全。我读过一些关于在数据库中存储会话密钥的内容,但我不确定它是如何工作的,或者如何实现它。

有人可以解释如何实现安全身份验证吗?

另外,对于我可以合并的易于学习而不是自己编写的 PHP 身份验证库有什么建议吗?

【问题讨论】:

标签: php authentication


【解决方案1】:

检查this answer here

虽然答案是 3 岁,但建议的 phpass 库是最新的。

另外,+1 给 Aron Cederholm。密码安全性是一个广泛的主题,您应该首先查看此处已在 StackOverflow 上讨论过的相关问题,以便您更熟悉该主题和安全方面的最佳实践。

虽然我喜欢框架(SymfonyZend 等),因为它们通常会实现这些良好实践,但仅仅使用它们并不能使您成为一名优秀的程序员。你必须了解它的内部运作。我总是向致力于编写自己的安全身份验证机制的程序员致敬(只要他们不在真正需要强大安全性的实时站点中实现它),因为这是学习和理解主题内部的最佳方式。始终从现有实现开始,然后将其用作创建自己的代码库的示例。

【讨论】:

  • Zend 实际上有一个可怕的 Auth 模块,它带有不安全的示例。
【解决方案2】:

注意事项:

  1. 身份验证;验证用户的真实身份。
  2. 授权;确保允许用户做他们想做的事。
  3. 会计;记录和审核他们的行为。

对于身份验证,您需要跟踪连接到系统并(通常)通过系统进行身份验证的“用户”。这需要知道标识符(用户名、电子邮件或其他一些唯一令牌)和密码。将用户名和密码存储在某处,但切勿在未先保护密码的情况下存储密码:不要使用带有盐的消息摘要算法(如 MD5 或 SHA1)。请改用bcrypt。虽然在这里使用框架不是一个坏主意,但不要总是依赖框架来做正确的事情。

对于授权,您需要跟踪用户正在执行的操作并执行权限检查以查看他们是否被允许执行他们正在尝试的操作。这可以通过多种不同的方式来实现,而且它们都是特定于领域的——虽然你可以找到很多框架来帮助你,但你不会经常找到一个简单的例子。

对于记账,您需要记录用户所做的操作。这是任何应用程序中最常被忽视的部分,但当坏事发生时,拥有和从 Web 服务器访问日志重建它是一场噩梦。同样,这是特定于领域的,但一个好的框架应该可以简化它的实现。

最后,将这三者结合在一起就是您的用户会话。当您在 PHP 中调用 'session_start()' 时,它会将会话标识符作为 cookie 发送到客户端,并将包含该用户的 $_SESSION 内容的文件存储到服务器的硬盘驱动器中。您还可以配置 PHP 以覆盖默认功能并使用 session_set_save_handler 保存会话数据。然后,您可以将该信息存储到数据库中。

TL;DR:使用 CodeIgniter、Drupal、Yii 等框架或其他一些积极开发的解决方案。绝大多数框架可以做任何你需要它们做的事情,如果它们不做,它们可以很容易地修改。 不要为此创建自己的框架;使用一个已经可用的。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2021-07-24
      • 2018-10-09
      • 1970-01-01
      • 2011-10-27
      • 2011-08-17
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 2021-12-31
      相关资源
      最近更新 更多