我们在保护什么?
首先,人们应该问他们到底要保护什么。在这种情况下,有两种不同的威胁:
- 威胁 1攻击者暴力破解随机电子邮件以查找有效的注册电子邮件。这在理论上可以用来创建垃圾邮件列表,但据我所知,从来没有做过,因为发送电子邮件比经历额外的麻烦更简单(我收到垃圾邮件的次数声称我的 [一些美国银行] 帐户需要采取行动,尽管不住在美国是不计其数)。
- 威胁 2攻击者针对特定用户或特定用户列表。当某人在某处注册的事实可能会产生后果时,这一点尤其重要。示例:在 Grindr 或 Ashley Madison 上拥有帐户的行为本身在某些社区可能是危险的。
更大的图景
下一个要考虑的问题是其他地方可能会暴露相同的信息并将其作为一个整体来考虑。通常,注册表会通知用户输入的电子邮件是否已经注册,但这当然不适用于大多数 B2B 软件。除了“与用户共享”功能(可以输入电子邮件以与该用户共享某些对象的输入框)之外,通常还会公开此信息,但由于这些信息很少见,我不会在此答案中包含这些信息。
公开注册系统的解决方案
首先,从用户体验的角度来看,在注册过程中不通知用户帐户已经存在是一件好事。这同样适用于密码重置表单,当用户输入错误或有多封电子邮件时,密码重置表单会静默失败1 。这并不意味着这是不应该做的事情,而是应该权衡安全风险和收益。
给定一个公开注册的系统,要考虑的重要一点是威胁 2对您产品的用户有多大。考虑到即使是适度的风险,也可以谨慎地将注册表单更改为仅输入姓名和电子邮件,给出“检查您的电子邮件以继续注册”的消息,如果电子邮件已经注册,则向用户发送电子邮件通知他们这个。同样,在这种情况下,密码重置表单不会以任何方式通知用户电子邮件是否有效。
另一方面,如果Threat 2最小,我们必须专门针对Threat 1建模。当然,之前的方法也可以完美地对抗威胁 1,但考虑到 UX 成本,值得考虑其他解决方案。最明显的解决方案是“电子邮件存在检查”和“忘记密码”检查的速率限制2(从技术上讲,这些调用甚至可以转到同一个 API 端点)。这些通常被设计为对前 10 次左右的调用相当宽松,但在那之后很快就会变得非常有限。
重要提示:切勿在未对注册表单实施类似限制的情况下从密码注册中删除错误消息。
未公开注册系统的解决方案
这一切都归结为与上述相同的问题(我应该先写这个),但是如果没有点击注册用户体验的“额外”成本,拥有一个安全的密码忘记表单相对“便宜”,虽然当然这对用户来说仍然令人不快,您仍然可以考虑速率限制是否不足以满足您的特定威胁模型。
笔记
1:与其默默地失败,不如至少向输入的电子邮件发送一封电子邮件,通知他们找不到他们的电子邮件。这 1) 阻止了攻击者大规模滥用系统(因为它会被注意到)和 2) 防止用户想知道为什么他们没有收到电子邮件。
2:请注意,速率限制会对大型网络或 VPN 的用户产生负面影响。始终考虑受众对您的重要性,并在此基础上花费足够的时间来确保应用程序即使在速率限制最苛刻的情况下也能保持正常运行(例如,通过解决验证码来降低速率限制或将最大速率限制设置为大约每分钟一次,并确保应用程序将等待整整一分钟(注意:考虑到一组用户在同一次会议开始时注册相同的服务,这仍然会令人不快)。