7

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

这样做的最佳过程是什么?我应该如何生成新密码?Zend 框架有什么可以让这更容易吗?

我还听说过发送一封电子邮件,其中包含指向短期页面的链接,可让他们设置新密码。Zend 框架如何做到这一点?

4

1 回答 1

22

Zend Framework 没有密码生成类。这里有一篇关于如何使用 PEAR 模块Text_Password生成密码的文章: https ://web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/howdoi/?p=118

但是,通过普通电子邮件发送密码并不是一个好的安全做法。相反,您应该重置他们的帐户,以便他们可以在不提供密码的情况下临时登录(给定您在电子邮件中发送给他们的过期 URL),并且一旦他们登录,要求他们将自己的密码更新为他们知道的密码。然后存储他们密码的加盐哈希。


以下是我在 Zend Framework 中执行此操作的一些建议:

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

于 2009-04-16T05:40:50.013 回答