我有一个使用Zend_Auth_Adapter_DbTable
的基本身份验证过程。我在身份验证控制器上有登录和注销操作。现在我想通过自动生成密码,保存新密码并向他们发送包含新生成密码的电子邮件来创建一个重置忘记密码的功能。
这样做的最佳流程是什么?我该如何生成新密码? Zend Framework有什么能让这更容易吗?
我还听说过发送一封电子邮件,其中包含一个短期页面的链接,可让他们设置新密码。如何使用Zend Framework完成这项工作?
答案 0 :(得分:22)
Zend Framework没有密码生成类。这是一篇关于如何使用PEAR模块Text_Password
生成密码的文章:
https://web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/howdoi/?p=118
但是,在普通电子邮件中发送密码并不是一个好的安全措施。相反,您应该重置他们的帐户,以便他们可以在不提供密码的情况下临时登录(给定您在电子邮件中发送的URL过期),并且一旦他们登录,就要求他们将自己的密码更新为他们< / em>知道。然后存储密码的盐渍哈希。
在Zend Framework中,这是一些关于这方面的建议:
AccountReset
:reset_id
(GUID主键),account_id
(对Accounts.account_id
的引用)和expiration
(时间戳)。 AccountController::resetAction()
的操作,即在用于创建帐户,登录,更改密码等的同一控制器中。AccountReset
表格中插入新行,其中包含新GUID,对用户帐户的引用以及expiration
将来30分钟左右的时间<
GUID >
”(如果您“使用路由规则更聪明,您可以缩短该URL,但将GUID保留在其中。”AccountController::resetAction()
收到请求时,它会在reset_id
表中查找其AccountReset
个参数。如果该GUID存在并且expiration
时间尚未过去,则向用户显示一个表单以更改其密码(无需验证并登录)。resetAction()
收到没有GUID的请求,或者数据库中不存在GUID,或者该行已通过其expiration
,则此操作可能会向用户显示一个按钮发起新的重置请求,并发送带有新GUID的电子邮件。请记住将此按钮设为POST请求!由于GUID仅在电子邮件中传达给该用户的地址,因此没有其他人可以获得更改密码的权限。即使用户的电子邮件被拦截,GUID也只会在有限的时间内授予该访问权限。
如果您想要更加谨慎,可以记下AccountReset
表中的客户端IP地址,并要求在30分钟的窗口内从具有相同IP地址的客户端更改密码
这只是袖手旁观,我没有实施或评估它是否具有适当的安全性。如果您负责实施安全性,那么您有责任阅读安全问题。一个备受推崇的PHP安全资源是http://phpsecurity.org/。