在密码重置期间我应该在哪里存储用户名?

信息安全 Web应用程序 密码管理 重设密码
2021-08-26 04:59:39

我是 Web 开发新手,正在尝试根据OWASP备忘单实现密码重置功能:忘记密码备忘单

备忘单建议在提交表单并将其发送到服务器时不要将用户名作为参数发送。相反,应该将其存储在服务器端会话中。

但是,我不确定我应该怎么做,因为我能够以这种方式存储用户名,用户需要输入他/她的用户名并在某个时候将其发送到服务器,对吧?为什么不将其与用户回答安全问题的表单一起发送?还是我只是以错误的方式理解这一点?

4个回答

这是我通常做的:

  1. 用户要求重置密码。

  2. 系统要求提供注册的电子邮件。

  3. 用户输入email,不管email是否存在,你说你发送了reset链接。

  4. 服务器将电子邮件、过期和重置令牌存储在reset_password表上

  5. 访问链接时,会检查过期时间并显示重置密码的表单。

用户只收到一个带有大随机令牌的链接。

你不应该相信客户。因此,如果客户能够在输入新密码的阶段发送他们的用户名,如果他们将用户名更改为其他人的会发生什么?他们将能够重置另一个用户的帐户并接管该帐户。

@ThoriumBR 的回答当然是正确的。另一种选择是在服务器上不存储任何状态,并在重置链接中编码所有信息,例如用户名和到期时间。这可以通过使用 HMAC 或类似方法对信息进行加密签名来安全地完成。您的语言可能有一些库可以处理这个问题,例如itdangerous for Python。

添加到ThoriumBR 的出色响应

  • 用户要求重置密码
  • 系统要求提供注册邮箱
  • 用户输入邮箱,不管邮箱是否存在,你说你发送了重置链接但还没有重置密码
  • reset_password服务器在表上存储电子邮件、过期和重置令牌
  • 当链接被访问...
    • 服务器检查重置令牌的到期,
    • 检查它以前没有使用过
    • 要求用户输入额外的身份验证令牌,可以是 2FA、SMS 代码、回答预设的安全问题等,最后
    • 打开一个表格来重置密码,
    • 之后,用户应该处于“注销”状态,因此他们需要使用新密码登录才能访问应用程序。
  • 此外,服务器验证重置链接在到期时间内仅使用过一次

用户只收到一个带有大随机令牌的链接。

发送用户名没有意义。在服务器端,您存储与哪个用户相关的密码重置令牌的信息。当用户单击链接时,您确切地知道它是什么用户。您根据令牌获取用户名并将其显示在密码重置表单中。