如何在Zend框架中生成随机密码或临时URL以重置密码?

7
我有一个基本的身份验证过程,使用Zend_Auth_Adapter_DbTable。我在我的身份验证控制器上有登录和注销操作。现在我想创建一个函数来重置忘记的密码,自动生成密码,保存新密码,并向他们发送一封电子邮件,其中包含新生成的密码。
最好的处理流程是什么?如何生成新密码?Zend框架是否有任何可以使此过程更轻松的东西?
我还听说过通过发送链接到短期页面的电子邮件来让他们设置新密码。如何使用Zend框架完成这个过程?
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、用户账户的引用以及过期时间(30分钟左右)。
  • 向该用户存档中的电子邮件地址发送一封电子邮件,包括他应该点击的URL:"https.../account/reset/reset_id/<GUID>"(如果你对路由规则很熟练的话,可以缩短URL,但要保留GUID)。
  • AccountController::resetAction() 接收到请求时,它会在 AccountReset 表格中查找其 reset_id 参数。如果该 GUID 存在且 expiration 时间尚未过期,则向用户呈现一个表单以更改密码(无需要求进行身份验证和登录)。
  • 如果 resetAction() 收到没有 GUID 的请求,或者数据库中不存在该 GUID 或该行已经过期,则此操作可以向用户展示一个按钮以发起新的重置请求,并发送一封带有新 GUID 的电子邮件。记得将此按钮设置为POST请求!

因为 GUID 只在发送到该用户的电子邮件地址中通信,所以其他人无法访问更改密码。即使用户的电子邮件被拦截,GUID 也只能在有限的时间内授予访问权限。

如果您想更加谨慎,您可以在 AccountReset 表格中记录客户端 IP 地址,并要求在 30 分钟的时间窗口内从具有相同 IP 地址的客户端更改密码。

这只是初步构想,我还没有实施或评估它是否具有适当的安全性。如果您负责实施安全措施,则有责任阅读有关安全问题的信息。PHP 安全方面的一个权威资源是 http://phpsecurity.org/


太棒了!非常有帮助。谢谢! - Andrew
我唯一的另一个问题是...我需要为GUID生成一个随机数吗?这会让我回到最初的问题,即如何处理它?此外,我应该如何强制确保数据库中的GUID是唯一的? - Andrew
通过将其设为主键来强制实现唯一性。如果您未使用自动递增 PK,您始终需要处理 INSERT 中的重复键异常。如果出现重复项,请生成另一个 GUID(或 UUID)并重试。 - Bill Karwin
谢谢!不知道那个函数存在。=] - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接