【发布时间】:2013-08-20 01:38:51
【问题描述】:
我目前正在完成一个网站,用户需要创建一个个人帐户才能玩同一网站上托管的游戏。我目前难以弄清楚的是如何在忘记密码的情况下为用户实施安全密码重置功能。
这是当前的流程:
第 1 步:用户点击网站上的“忘记密码”链接。
第 2 步:用户进入表单并输入电子邮件地址两次,然后才进入已发送电子邮件。
第 3 步:电子邮件包含指向另一个表单的链接,用户可以在该表单中输入两次新密码以进行确认。进入第二种形式后,系统会在数据库中的 Recover_Password 表中插入一条新记录,其中包含“id”、“token”、“created_at”和“expires_at”列。
这是链接-> (mywebsitename).com/form?id=99999&token=
其中“id”是用户的id,“token”是从do_hash($id . date('Y-m-d'))生成的
第 4 步:用户完成表单并被带到登录页面。系统从数据库中清除令牌记录,并从用户表中更新用户当前密码。
我还想知道如果用户在第二个表单中尝试刷新浏览器页面该怎么办。我目前只允许在 get 参数中有 id 和 token 值并且它们都存在于数据库中的情况下访问该页面。
我正在为整个网站使用 Codeigniter,我需要知道这是否是一种安全的方法,以及我应该如何处理令牌和数据库。谢谢!!
【问题讨论】:
-
“在发送电子邮件之前两次。” --- 要求用户重复 4 次电子邮件将使解决方案更加安全
-
这不是主要问题的答案,但这里没有理由使用散列。特别是如果它很容易被攻击者生成。您可以只使用一个非常长的随机字符串,因为无论如何您都在检查数据库。
-
设置令牌过期时间,用户点击提交后删除令牌... $_GET attr 上有两个随机生成的字段,
example.com/ChangePass.php?Token=&RefID=&UserID=?并且只允许在 refID 和令牌匹配时更改密码存储的值。 -
@zerkms 离题,但我的问题得到了解决。它在第 4 次硬重置后随机开始工作。我很害怕我现在必须重新启动服务器 -.-
-
@hRdCoder:如果您需要随机的东西 - 生成纯随机的东西总是一个好主意,而不是从某些用户(可猜测的)数据派生。如果您知道用户的 id - 您可以轻松生成哈希