使用用户 ID 代替电子邮件发送密码恢复令牌是不是安全?

Posted

技术标签:

【中文标题】使用用户 ID 代替电子邮件发送密码恢复令牌是不是安全?【英文标题】:Is safe to send password recover token by using User Id instead email?使用用户 ID 代替电子邮件发送密码恢复令牌是否安全? 【发布时间】:2022-01-23 20:06:39 【问题描述】:

我有一个带有帐户恢复流程的 Rails + Nuxt 项目。

当用户忘记他的注册电子邮件和密码时,会发生一种情况。 用户可以通过提交他的帐户 ID 来记住他的电子邮件。 然后,Rails 会回复用户的 ID 和电子邮件的混淆版本。

此时,用户已经知道他的电子邮件,但不知道他的密码。于是他点击了“记住密码”按钮。

默认情况下,Devise(身份验证库)期望完整的电子邮件提交(不是混淆),以便生成恢复链接并将其发送给用户。但此时,只有经过混淆的电子邮件可用,我不想打扰用户填写完整的电子邮件,因为我已经知道他是谁(从帐户 id)。

也就是说,我想知道是否存在一些关于覆盖以下 Devise 方法以使用用户 ID 而不是电子邮件发送恢复令牌的安全问题?

# Attempt to find a user by its email. If a record is found, send new
# password instructions to it. If user is not found, returns a new user
# with an email not found error.
# Attributes must contain the user's email
def send_reset_password_instructions(attributes = )
  recoverable = find_or_initialize_with_errors(reset_password_keys, attributes, :not_found)
  recoverable.send_reset_password_instructions if recoverable.persisted?
  recoverable
end

https://github.com/heartcombo/devise/blob/main/lib/devise/models/recoverable.rb

【问题讨论】:

【参考方案1】:

如果您最终将重置密码发送到与数据库中存在的用户相关的电子邮件地址,我认为提供电子邮件或任何其他用户 ID 在安全性方面没有区别

【讨论】:

【参考方案2】:

username enumeration 等漏洞存在中等风险。帐户 ID 往往比电子邮件地址更容易预测,因此随着用户群的增长,您将面临有人滥用它来枚举帐户的风险。

您可以通过使用reCAPTCHA 或要求其他已知信息因素或两者兼而有之来减轻部分风险。

指出此功能与传统重置功能之间的区别也很重要。重置功能可以通过对有效和无效电子邮件做出完全相同的响应来防止收获攻击。例如:

If the email you provided is valid, a password reset link has been sent.

此恢复功能没有该功能。

【讨论】:

以上是关于使用用户 ID 代替电子邮件发送密码恢复令牌是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JWT 令牌使忘记密码更安全?

使用发送到电子邮件的动态 URL 实现 Spring Security 密码恢复的指南

密码恢复不发送电子邮件。

以 html 帖子形式存储重置密码令牌是不是安全?

是否有与通过电子邮件向新用户发送身份验证令牌相关的 NIST 标准?

DocuSign 集成。是不是可以在未经用户同意的情况下获得身份验证令牌。我想使用我的凭据在内部发送 docusign 信封电子邮件 [关闭]