我正在考虑编写自己的身份验证脚本,但我对安全性知之甚少。
从我正在阅读的文章来看,它看起来通常涉及用盐哈希密码并将其存储在数据库中。然后,当用户请求登录时,密码被哈希并与数据库进行比较。如果匹配,则用户的数据存储在$ _SESSION。
但是,我不知道这是否安全。我读了一些关于在数据库中存储会话密钥的内容,但我不确定它是如何工作的,或者如何实现它。
有人可以解释如何实施安全身份验证吗?
此外,对于我可以合并的PHP身份验证库是否有任何建议,这些建议易于学习而不是自己编写?
答案 0 :(得分:5)
要记住的事情:
对于身份验证,您需要跟踪连接到(通常)系统身份验证的“用户”。这需要知道标识符(用户名,电子邮件或其他一些唯一令牌)和密码短语。将用户名和密码短语存储在某处,但永远不会存储密码短语而不首先保护密码:不要使用带有盐的消息摘要算法(如MD5或SHA1)。请改用bcrypt。虽然在这里使用框架并不是一个坏主意,但不要总是依赖框架来做正确的事情。
对于授权,您需要跟踪用户正在执行的操作并执行权限检查以查看是否允许他们执行他们正在尝试的操作。这可以通过多种不同的方式实现,并且所有这些都是特定于域的 - 您不会经常找到它的简洁例子,尽管您可以找到许多框架来帮助您。
对于记帐,您需要记录用户执行的操作。这是任何应用程序中最常被忽略的部分,但是当发生不好的事情时,从Web服务器访问日志中获取和重建它是非常关键的知识是一场噩梦。同样,这是特定于域的,但是一个好的框架应该可以简化它的实现。
最后,将所有这三个结合在一起就是用户的会话。当您在PHP中调用'session_start()'时,它会将会话标识符作为cookie发送到客户端,并将文件存储到服务器的硬盘驱动器中,其中包含该用户的$_SESSION
内容。您还可以配置PHP以覆盖默认功能并使用session_set_save_handler保存会话数据。然后,您可以将该信息存储到数据库中。
TL; DR :使用类似CodeIgniter,Drupal,Yii或其他一些积极开发的解决方案的框架。绝大多数框架都可以完成您需要的任何内容,如果不需要,可以非常轻松地修改它们。 不要为此创建自己的框架;使用已经可用的。
答案 1 :(得分:5)
虽然答案是3年,但建议的phpass库是最新的。
此外,+1到Aron Cederholm。密码安全性是一个广泛的主题,您应首先查看已在StackOverflow上讨论的相关问题,以便您更加熟悉安全性的主题和最佳实践。
虽然我喜欢框架(Symfony,Zend等),因为它们通常会实现这些良好实践,但仅使用它们并不能使您成为一名优秀的程序员。你必须学习它的内部运作。我总是向程序员致敬,他们喜欢编写自己的安全认证机制(只要他们不在真正需要强大安全性的实时网站中实现它),因为这是学习和理解主题内容的最佳方式。始终从现有实现开始,然后以此为例创建自己的代码库。
答案 2 :(得分:1)
我使用tank_auth(一个Codeigniter插件)非常好。源代码是如何实现安全登录的一个很好的参考。