如何生成随机密码或临时URL,以便在Zend Framework中重置密码?

时间:2009-04-16 05:02:48

标签: zend-framework authentication forgot-password

我有一个使用Zend_Auth_Adapter_DbTable的基本身份验证过程。我在身份验证控制器上有登录和注销操作。现在我想通过自动生成密码,保存新密码并向他们发送包含新生成密码的电子邮件来创建一个重置忘记密码的功能。

这样做的最佳流程是什么?我该如何生成新密码? Zend Framework有什么能让这更容易吗?

我还听说过发送一封电子邮件,其中包含一个短期页面的链接,可让他们设置新密码。如何使用Zend Framework完成这项工作?

1 个答案:

答案 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中,这是一些关于这方面的建议:

  • 使用以下字段定义表AccountResetreset_id(GUID主键),account_id(对Accounts.account_id的引用)和expiration(时间戳)。
  • 实施名为AccountController::resetAction()的操作,即在用于创建帐户,登录,更改密码等的同一控制器中。
  • 当用户选择重置其帐户时,请在AccountReset表格中插入新行,其中包含新GUID,对用户帐户的引用以及expiration将来30分钟左右的时间
  • 发送电子邮件至该用户的档案地址,包括他应点击的网址:“https ... / account / reset / reset_id / < 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/