Set database 'user' table for password recovery
我有个问题。我正在执行密码恢复,然后我想:"如果一个‘陌生人’进行未经授权的密码恢复,更改别人的密码怎么办?"所以,我的第一个决定是:我将在"用户"表中设置两个字段,分别称为"密码"和"临时密码"。如果真正的用户要求密码恢复,新的随机密码将存储在"临时密码"中,并发送电子邮件。这样,恶意用户就不会更改任何其他人的密码,电子邮件所有者可以拒绝更改密码的尝试。是吗?提前感谢您的帮助。问候语
- 是的。这是个好方法。有关详细信息,请参阅此处:stackoverflow.com/questions/4763719/php-password-recovery
- 为什么不在用户通过电子邮件确认时生成随机密码并替换密码呢?这样就不需要两个字段,只需要密码字段。
- 此外,您通常希望密码具有历史记录(即,能够禁用该用户以前使用的密码),这意味着您通常需要一个单独的密码表…在这一点上,旧密码不会消失。
- 您不应该生成新密码,也不应该通过电子邮件发送新密码——只应生成一个临时令牌,允许用户自己重置密码。你可以通过电子邮件告诉我们,如果以后有人发现它是不可用的。一旦他们遵循链接,他们将能够更新密码-这将防止任何其他人重置另一个用户的密码。
我建议您通过将临时密码存储在与您的user表分开的表中来规范化这一点。每个用户在其生命周期内很可能会多次尝试密码恢复,您将希望为后代存储这些尝试的每个记录。
如果将该字段保留在user表中,则第一个密码恢复请求之后的每个后续请求都将覆盖上一个请求。
确保此新表中有一列指示当前处于活动状态的请求,并且有服务器端/数据库脚本,确保每个用户ID只能有一行具有活动标志。
- +1这种方法很容易使临时密码的有效期到期。
- 对,我没想到。我用另一张桌子!谢谢!
- 你不应该真的存储密码-只是一个临时重置令牌。这不需要是一个单独的表,因为通过电子邮件重置可以使用同一时间段内发送多个请求的相同值。
- @silverlightfox您可以存储一个令牌,但您肯定应该有一个单独的表来跟踪重置请求。
- 我不明白为什么你需要它-为什么你要为同一个用户进行多次密码重置?并发的可以使用相同的令牌。
- @银光狐狸,你一次只能有一个活动的。但是为了安全起见,您应该保留所有过去请求的列表。如果一个帐户在一天的时间内收到200个重置请求,则应该有一个标志被取消。
- 同意,但这将是一个单独的审计表。实际的重置机制不需要涉及到这一点——它可以使用当前令牌来确定令牌是否有效。