在密码重置期间我应该在哪里存储用户名?
信息安全
Web应用程序
密码管理
重设密码
2021-08-26 04:59:39
4个回答
这是我通常做的:
用户要求重置密码。
系统要求提供注册的电子邮件。
用户输入email,不管email是否存在,你说你发送了reset链接。
服务器将电子邮件、过期和重置令牌存储在
reset_password
表上访问链接时,会检查过期时间并显示重置密码的表单。
用户只收到一个带有大随机令牌的链接。
你不应该相信客户。因此,如果客户能够在输入新密码的阶段发送他们的用户名,如果他们将用户名更改为其他人的会发生什么?他们将能够重置另一个用户的帐户并接管该帐户。
@ThoriumBR 的回答当然是正确的。另一种选择是在服务器上不存储任何状态,并在重置链接中编码所有信息,例如用户名和到期时间。这可以通过使用 HMAC 或类似方法对信息进行加密签名来安全地完成。您的语言可能有一些库可以处理这个问题,例如itdangerous for Python。
添加到ThoriumBR 的出色响应:
- 用户要求重置密码
- 系统要求提供注册邮箱
- 用户输入邮箱,不管邮箱是否存在,你说你发送了重置链接但还没有重置密码
reset_password
服务器在表上存储电子邮件、过期和重置令牌- 当链接被访问...
- 服务器检查重置令牌的到期,
- 检查它以前没有使用过,
- 要求用户输入额外的身份验证令牌,可以是 2FA、SMS 代码、回答预设的安全问题等,最后
- 打开一个表格来重置密码,
- 之后,用户应该处于“注销”状态,因此他们需要使用新密码登录才能访问应用程序。
- 此外,服务器验证重置链接在到期时间内仅使用过一次
用户只收到一个带有大随机令牌的链接。
发送用户名没有意义。在服务器端,您存储与哪个用户相关的密码重置令牌的信息。当用户单击链接时,您确切地知道它是什么用户。您根据令牌获取用户名并将其显示在密码重置表单中。