2012-03-02 43 views
6

我正在考虑编写自己的认证脚本,但我对安全性知之甚少。我应该在PHP中使用什么用户身份验证?

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

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

有人可以解释如何实施安全认证?

另外,是否有任何PHP身份验证库的建议我可以合并,很容易学习,而不是写我自己的?

+2

请首先阅读以下优秀摘要:[安全哈希和盐的php密码](http://stackoverflow.com/questions/401656/secure-hash-and-salt-for-php-passwords) – 2012-03-02 08:00:49

+1

您应该重新 - 尽可能使用现有的认证框架,因为它确实很复杂。例如,看一下https://github.com/delight-im/PHP-Auth,它既是框架不可知的,也是与数据库无关的。 – caw 2016-10-21 21:04:20

回答

5

检查this answer here

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

此外,+1阿伦Cederholm。密码安全性是一个广泛的主题,您应该首先看看StackOverflow中已经讨论过的相关问题,以便您更熟悉安全性的主题和最佳实践。

虽然我喜欢框架(SymfonyZend等),因为它们通常执行这些好的做法,只是用他们不会让你一个优秀的程序员。你必须学习它的内在运作。我总是向一位编程他自己的安全认证机制的编程员致敬(只要他们没有在真正需要强大安全性的实时站点中实现它),因为这是学习和理解该主题内容的最佳方式。总是从现有的实现开始,然后用它作为创建自己的代码库的例子。

+0

Zend实际上有一个可怕的Auth模块,它带有不安全的例子。 – Jacco 2012-11-29 14:31:18

5

事情要记住:

  1. 认证;验证用户是他们说他们是谁。
  2. 授权;确保用户被允许做他们想做的事情。
  3. 会计;记录和审核他们的工作。

对于身份验证,您需要跟踪连接到(经常)与系统进行身份验证的“用户”。这需要知道一个标识符(用户名,电子邮件或其他独特的令牌)和密码短语。将用户名和密码短语存储在某个地方,但从不存储密码短语但不保护密码:不要使用带有盐的消息摘要算法(如MD5或SHA1)。改为使用bcrypt。尽管在这里使用框架并不是一个坏主意,但不要总是依靠框架来做正确的事情。

对于授权,您需要跟踪用户正在执行的操作,并执行权限检查以查看是否允许他们执行他们正在尝试的操作。这可以通过多种不同的方式完成,并且所有这些都是特定领域的 - 你不会经常发现一个干净的例子,尽管你可以找到许多框架来帮助你。

对于会计,您需要记录用户所做的操作。这是任何应用程序中最经常被忽略的部分,但是当发生不好的事情时,从Web服务器访问日志中获取并重建它是非常关键的知识,这是一场噩梦。同样,这是特定领域的,但一个好的框架应该可以缓解它的实现。

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

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

1

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