【问题标题】:Forgot Password - what fields should I add?忘记密码 - 我应该添加哪些字段?
【发布时间】:2011-12-19 11:26:26
【问题描述】:

我正在开发忘记密码功能。

用户在忘记密码页面上输入他们的电子邮件地址,然后哈希令牌链接将通过电子邮件发送。

令牌看起来像这样:

http://www.domain.com/account/resetpassword/4u240238402348239048092384908239080

如果用户单击该链接,它将从用户users 表中搜索哈希令牌。如果找到,则显示文本字段以更改密码。

我将使用hash("sha256",...) 函数来生成哈希。

哈希应该如何存储在users表中?

是否需要添加“reset_hash”和“reset_date”等字段?

【问题讨论】:

  • 我还要注意用户不能使用注入或其他方法来欺骗哈希。

标签: php mysql


【解决方案1】:

是的,您应该添加两列:一列用于重置哈希,另一列用于重置发出时的时间戳。后者应该用于确保密码在特定时间范围内被重置。

密码重置后也应删除哈希和/或时间,以防止将来使用相同的哈希进行重置。

【讨论】:

  • 密码修改后reset hash和timestamp的值应该是多少?我猜是空/空白?
  • @user791022:是的,任何一个都可以。只需确保用户无法访问 http://www.domain.com/account/resetpassword/ 并对哈希和空白/NULL 的用户发出密码重置。
【解决方案2】:

是的,将这些字段存储在 users 表中是个好主意。您可以检查哈希是否有效并阻止它将 reset_date 设置为实际日期时间。存储 expire_date 字段也是一个好主意。

【讨论】:

    【解决方案3】:

    将哈希存储为 varchar(256) 并且您可能想要一个请求日期,我会在收到请求时使用一个 int 字段存储 time() 以便您可以简单地执行 time() - {dbtime}如果超过某个值,则请求已超时。

    编辑:如上所述,当请求完成时,您应该将这两个字段都设置为 NULL。

    【讨论】:

      【解决方案4】:

      你想做正确的事,但我建议为这样的一次性操作创建一个单独的表。在我看来,用户表似乎不是存储这些信息的正确位置。

      如果您创建一个单独的表格,您可以稍后添加其他类型的操作,例如电子邮件确认等,并添加到期日期等字段。如果执行了操作,您可以简单地从表中删除该条目。

      【讨论】:

        猜你喜欢
        • 2020-10-19
        • 1970-01-01
        • 2013-08-03
        • 1970-01-01
        • 2010-11-21
        • 2021-06-27
        • 2012-07-25
        • 2016-04-18
        • 2018-03-12
        相关资源
        最近更新 更多