如何在 Zend Framework 中生成用于重置密码的随机密码或临时 URL?
Posted
技术标签:
【中文标题】如何在 Zend Framework 中生成用于重置密码的随机密码或临时 URL?【英文标题】:How to generate random password, or temporary URL, for resetting password in Zend Framework? 【发布时间】:2010-10-19 18:45:39 【问题描述】:我有一个使用Zend_Auth_Adapter_DbTable
的基本身份验证过程。我的身份验证控制器上有登录和注销操作。现在我想创建一个功能,通过自动生成密码、保存新密码并向他们发送一封包含新生成密码的电子邮件来重置忘记的密码。
执行此操作的最佳流程是什么?我应该如何生成新密码? Zend 框架有什么可以让这更容易吗?
我还听说过发送一封电子邮件,其中包含一个短期页面链接,可让他们设置新密码。 Zend 框架如何做到这一点?
【问题讨论】:
【参考方案1】:Zend Framework 没有密码生成类。这是一篇关于如何使用 PEAR 模块Text_Password
生成密码的文章:
https://web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/howdoi/?p=118
但是,通过普通电子邮件发送密码并不是一个好的安全做法。相反,您应该重置他们的帐户,以便他们可以在不提供密码的情况下临时登录(给定您在电子邮件中发送给他们的过期 URL),并且一旦他们登录,要求他们将自己的密码更新为 他们知道。然后存储他们密码的加盐哈希。
以下是我在 Zend 框架中执行此操作的一些建议:
定义一个表AccountReset
,其中包含以下字段:reset_id
(GUID 主键)、account_id
(引用Accounts.account_id
)和expiration
(时间戳)。
实施一个名为 AccountController::resetAction()
的操作,即在您用于创建帐户、登录、更改密码等的同一控制器中。
当用户选择重置他的帐户时,在 AccountReset
表中插入一个新行,其中包含新的 GUID、对用户帐户的引用以及未来 30 分钟左右的 expiration
。
向该用户的存档地址发送一封电子邮件,包括他应该点击的 URL:“https.../account/reset/reset_id/<
GUID>
”(如果你很聪明的话路由规则,您可以缩短该 URL,但保留 GUID)。
当AccountController::resetAction()
收到请求时,它会在AccountReset
表中查找其reset_id
参数。如果该 GUID 存在且 expiration
时间尚未过去,则向用户提供一个表单以更改其密码(无需他经过身份验证和登录)。
如果resetAction()
收到一个没有 GUID 的请求,或者数据库中不存在该 GUID,或者该行已通过其 expiration
,则此操作可能会向用户显示一个按钮来启动一个新的重置请求,并发送一封带有新 GUID 的电子邮件。请记住将此按钮设为 POST 请求!
由于 GUID 仅通过电子邮件发送到该用户的地址,因此其他人无法获得更改密码的访问权限。即使用户的电子邮件被截获,GUID 也会在有限的时间内授予该访问权限。
如果您想更加谨慎,可以在AccountReset
表中记下客户端 IP 地址,并要求在 30 分钟内从具有相同 IP 地址的客户端更改密码。
这只是现成的,我还没有实现它或评估它的适当安全性。如果您负责实施安全性,那么您有责任阅读安全性问题。一个备受推崇的 php 安全资源是 http://phpsecurity.org/。
【讨论】:
很棒的反应!这很有帮助。谢谢! 我唯一的另一个问题是......我需要为 GUID 生成一个随机数吗?因此,让我回到我最初的问题,即如何去做?另外,我应该如何强制 GUID 在数据库中是唯一的? 通过将其设为主键来强制唯一性。如果您不使用自动增量 PK,则始终必须处理 INSERT 上的重复键异常。如果出现重复,请生成另一个 GUID(或 UUID)并重试。 谢谢!不知道有这个功能。 =]以上是关于如何在 Zend Framework 中生成用于重置密码的随机密码或临时 URL?的主要内容,如果未能解决你的问题,请参考以下文章
zend framework 重定向方法(render, forward, redirect)总结
PHP Zend Framework:将表单重定向回页面用户来自
如何在 Zend_framework 中不呈现响应的情况下发送保存的请求
PHP Zend Framework:注销后,将用户重定向到他来自的页面