【问题标题】:Set database 'user' table for password recovery为密码恢复设置数据库“用户”表
【发布时间】:2014-10-01 02:48:30
【问题描述】:

我有一个问题。我正在实施密码恢复,然后我想:“如果'陌生人'进行未经授权的密码恢复,更改别人的密码怎么办?” 所以,我的第一个决定是:我将在“用户”表中设置两个字段,分别称为“密码”和“临时密码”。如果真实用户要求恢复密码,新的随机密码将存储在“temp_password”中,并发送一封电子邮件。这样,恶意用户不会更改其他任何人的密码,并且电子邮件所有者可以拒绝密码更改尝试。那正确吗?预先感谢您的帮助。 问候

【问题讨论】:

  • 是的。这是一个很好的方法。请参阅此处了解更多信息:stackoverflow.com/questions/4763719/php-password-recovery
  • 为什么不直接生成随机密码并在用户通过电子邮件确认时替换密码?这样你就不需要两个字段,你只需要一个密码字段。
  • 此外,您通常希望密码具有历史记录(即,能够禁止该用户以前使用过的密码),这意味着您通常需要一个单独的 table 用于密码...在这一点上,旧密码无论如何都不会消失。
  • 您不应生成新密码或通过电子邮件发送新密码 - 只能是允许用户自行重置密码的临时令牌。您可以通过电子邮件发送此信息,如果有人在以后发现它,它将无法使用。一旦他们点击链接,他们将能够更新密码 - 这将防止其他任何人重置其他用户的密码。

标签: php mysql sql security password-recovery


【解决方案1】:

我建议您通过将临时密码存储在与user 表不同的表中来规范这一点。每个用户在其生命周期中很可能会进行多次密码恢复尝试,您需要存储每次尝试的记录以供后代使用。

如果您保留user 表中的字段,则第一个密码恢复请求之后的每个后续请求都将覆盖前一个。

确保您在此新表中有一个列来指示当前处于活动状态的请求,并具有确保每个用户 ID 只有一行可以具有活动标志的服务器端/数据库脚本。

【讨论】:

  • +1 这种做法很容易使临时密码失效。
  • 对,我没想到。我会用另一张桌子!谢谢!
  • 您不应该真正存储密码 - 只是一个临时重置令牌。这不需要是一个单独的表,因为通过电子邮件重置可以使用相同的值,多​​个请求在同一时期发送。
  • @SilverlightFox 你可以存储一个令牌,但你绝对应该有一个单独的表来跟踪重置请求
  • 我不明白您为什么需要它 - 为什么要为同一个用户重置多个密码?并发的可以使用相同的令牌。
猜你喜欢
  • 1970-01-01
  • 2019-09-08
  • 2012-10-20
  • 2020-05-29
  • 2014-02-01
  • 2012-11-30
  • 1970-01-01
  • 2012-01-22
  • 1970-01-01
相关资源
最近更新 更多