0

我正在写一个密码重置页面。

逻辑:

  1. 用户请求密码
  2. 它通过附加到 /reset/ 的唯一字符串(过期)发送到他们的电子邮件$string
  3. 在我的控制器中的页面上,我检查字符串是否与数据库中的一个匹配,如果是,那么我将其与 userId 匹配
  4. 如果是这样,我允许他们输入新的通行证
  5. 如果他们 POST 到同一个控制器并搞砸并输入 2 个不正确的密码,我会丢失带有重置字符串的原始 URL,所以现在我不知道要在数据库中更新哪个用户

我的选择(我能想到的):

  1. 在会话中设置字符串和用户 ID 并在控制器中查找(并确保在成功重置通行证后将其清除)
  2. 在上面的第 4 步中,我将在表单的隐藏输入字段中添加用户 ID,并使用该 ID 进行 POST 以检查它是哪个用户
4

2 回答 2

1

我会这样做:

  1. 用户以表格形式提供他的电子邮件并请求重置密码。
  2. 您检查数据库中与电子邮件匹配的 uid(用户 id)。
  3. 如果用户存在,您创建一个这样的网址: http ://domain.com/password_reset.php?uid=xxxx&key=fdhgf5115d4f15dfdb5fdf5
  4. 密钥由 this 生成:$key = md5(uniqid())
  5. 您将密钥存储到具有 uid 的会话中: $_SESSION['pass_res']['key'] = $key; $_SESSION['pass_res']['uid'] = $uid;
  6. 当用户单击 URL 时,您检查是否: $_SESSION['pass_res']['uid'] == $_GET['uid'] 并且如果 $_SESSION['pass_res']['key'] == $_GET[ '钥匙']
  7. 如果它们匹配,您允许用户更改他的密码
  8. 在此之后 unset($_SESSION['pass_res'])
  9. 此外,如果用户关闭他的浏览器会话过期

通过这种方式,只有具有请求重置密码的会话 ID 的用户才能更改其密码

于 2012-09-21T18:50:16.853 回答
0

您在选项 2 中的解决方案(将令牌添加到隐藏的输入)是有道理的,或者您可以将表单发布到相同的 URL(其中包含令牌的那个,这样您就不会丢失它)并构建您的逻辑以根据表格是否已张贴。

逻辑可能如下所示:

  • 用户点击 site.com/password/reset/token_here 作为 GET 或 POST
  • 从数据库中的 URL 检查令牌以查看其是否有效和当前
  • 如果请求方法是 POST,请检查匹配的安全密码
    • 如果密码不匹配,则将错误消息分配给 HTML 视图
    • 如果密码匹配,更改密码,删除令牌,重定向到成功页面
  • 向用户显示表单 - 表单发回带有令牌的相同 URL
于 2012-09-21T18:41:30.987 回答