我有一个使用Zend_Auth_Adapter_DbTable
. 我的身份验证控制器上有登录和注销操作。现在我想创建一个功能来重置忘记的密码,方法是自动生成密码,保存新密码,并向他们发送一封包含新生成密码的电子邮件。
这样做的最佳过程是什么?我应该如何生成新密码?Zend 框架有什么可以让这更容易吗?
我还听说过发送一封电子邮件,其中包含指向短期页面的链接,可让他们设置新密码。Zend 框架如何做到这一点?
我有一个使用Zend_Auth_Adapter_DbTable
. 我的身份验证控制器上有登录和注销操作。现在我想创建一个功能来重置忘记的密码,方法是自动生成密码,保存新密码,并向他们发送一封包含新生成密码的电子邮件。
这样做的最佳过程是什么?我应该如何生成新密码?Zend 框架有什么可以让这更容易吗?
我还听说过发送一封电子邮件,其中包含指向短期页面的链接,可让他们设置新密码。Zend 框架如何做到这一点?
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 分钟左右的时间。<
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/。