这样做的最佳流程是什么?我该如何生成新密码? Zend Framework是否有任何可以使这更容易的东西?
我还听说过发送一封电子邮件,其中包含一个短期页面的链接,可以让他们设置一个新密码.如何使用Zend Framework完成这项工作?
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的引用)和到期(时间戳).
>实现一个名为AccountController :: resetAction()的动作,即在用于创建帐户,登录,更改密码等的同一个控制器中.
>当用户选择重置其帐户时,在AccountReset表中插入一个新行,其中包含新GUID,对用户帐户的引用以及将来30分钟左右的到期时间.
>发送电子邮件到该用户的档案地址,包括他应点击的URL:“https … / account / reset / reset_id /< GUID>” (如果您对路由规则很聪明,可以缩短该URL,但将GUID保留在其中).
>当AccountController :: resetAction()收到请求时,它会在AccountReset表中查找其reset_id参数.如果该GUID存在且未到期时间,则向用户显示更改其密码的表单(无需对其进行身份验证并登录).
>如果resetAction()收到没有GUID的请求,或者数据库中不存在GUID,或者该行已经过期,则此操作可能会向用户显示一个按钮以启动新的重置请求,并且发送包含新GUID的电子邮件.记得让这个按钮成为POST请求!
由于GUID仅通过电子邮件传递给该用户的地址,因此没有其他人可以获得更改密码的权限.即使用户的电子邮件被截获,GUID也只有有限的时间授予该访问权限.
如果您想要更加谨慎,可以记下AccountReset表中的客户端IP地址,并要求在30分钟的窗口内从具有相同IP地址的客户端更改密码.
这只是袖手旁观,我没有实施或评估它是否具有适当的安全性.如果您负责实施安全性,那么您有责任阅读安全问题.一个备受推崇的PHP安全资源是http://phpsecurity.org/.