我应该让用户知道他们输入了未知的用户名或电子邮件地址吗?

信息安全 隐私 攻击预防 防御
2021-09-07 07:52:49

在我的网站上,我有一个密码重置页面,如果用户忘记了密码,可以使用该页面。在此页面上,他们可以输入他们的用户名或电子邮件地址,然后点击“重置”,这将向他们发送一个链接以重置他们的密码。

如果他们输入了错误的用户名或电子邮件,我应该让他们知道它在我们的系统中不存在,还是存在安全风险?

4个回答

答案通常是视情况而定。这实际上是基于您系统的安全性。

用户可以不受限制地创建新帐户

如果是这样,告诉他们是没有意义的您不能有交叉的用户名或电子邮件地址,因此如果他们的用户名或电子邮件已被使用,您必须通知新用户。然后,攻击者将能够通过攻击新的用户注册系统来获取用户名和电子邮件。在忘记密码部分为他们提供类似的攻击场所不会损害您的安全,因为该方法仅存在于其他地方。只需确保您在注册系统中使用的限制与请求密码的限制相同(即您使用的任何反垃圾邮件系统)。

用户不能不受限制地创建新帐户

考虑一个仅限邀请的系统。您被允许注册的唯一方法是有人授权。这可能是管理员设置您的初始用户名、电子邮件和密码(可能手动)的情况。该系统将允许您通过不告诉用户他们输入的信息是否正确来获得安全性。然后,用户名和电子邮件可能会被视为保护不力的秘密。

全面的

请注意,这是对可用性的打击。如果有人输错了他们的电子邮件地址,他们可能不会注意到他们输错了。来自网站的电子邮件并不总是立即发送,因此用户可能正在等待一封永远不会发送的电子邮件。

有一个古老的传统,区分“该用户名不存在”和“该用户名存在但密码错误”。它来自较早的时代,当时攻击者和防御者都是新的工作,并且背景不同。当时,攻击者在“外面”,他想猜测一个用户名+密码对以进入大型机。那时,密码甚至比现在还要糟糕,人们认为对用户名保密会大有帮助(“攻击者永远猜不到我们有一个名为‘smith’的用户!”)。

一个有趣的阅读是对 1988 年“莫里斯”蠕虫的描述由于所有蠕虫实例在不受控制的情况下疯狂复制所消耗的绝对带宽,那只野兽摧毁了整个互联网(它比现在更小)。该蠕虫可以通过多种方法进入系统,其中一种是密码破解。有趣的是,该蠕虫首先从各种来源收集帐户名称,包括“.forward”文件,然后(并且仅在那时)尝试包含 432 个单词的字典。这说明了两点:

  • 帐户名称不是秘密。它们不仅仅存在于目标系统上;它们也可以从其他机器上的各种数据元素中推断出来,包括(在现代)SSH 配置文件、地址簿......

  • 早在 1988 年,他们在选择强密码方面真的很糟糕。

时代变了。特别是,正如其他人指出的那样,许多现代系统允许自动注册:任何人都可以尝试登录,并亲自查看给定帐户名称是否“免费”。许多其他目标系统允许收集帐户名(例如,Web 论坛可能使用贡献者的伪帐户名)。这使得对用户名保密的依赖比以往任何时候都更加脆弱。另一方面,人们可能希望普通用户现在选择更强的密码(否则会太令人沮丧)。最终结果是平衡的变化:将账户名称保密的传统已经失去了大部分相关性。

然而,传统是强大的力量。如果您的系统返回错误“该用户名不存在”和“您的密码不正确”的不同消息,那么一些用户可能会感到紧张和震惊,并会抱怨您不负责任地泄露全世界都认为乔的名字是乔。您可能会争论并提供合理的理由说明这不是问题(见上文);有些人仍然不相信。当用户是客户时,这不是一件好事而且,无论如何,这会消耗太多时间。保持旧传统更容易,即使它没有实际意义;您可以将其视为应对人类用户基本非理性的一种方式。

不,如果用户名不存在,您不应该让他们知道,因为这会让攻击者发现他们可以尝试破解的帐户名。如果您发送通用的“已发送重置电子邮件,请检查您的收件箱”。即使该帐户不存在,攻击者也不会从尝试中获得任何收益。

就安全性而言,最重要的是攻击者通过了解特定 ID 或电子邮件地址是否在您的站点上拥有帐户可以获得什么?

例如,如果您正在从事任何可能被视为隐私问题的业务,或者您网站上的帐户是否可用于花钱或具有任何内在价值(换句话说,我是否可以通过网络钓鱼您的地点)。有些网站没有此类问题,例如微博平台或 OSN 无论如何都会在您的页面上显示您的 ID,因此让用户知道他们输入了不存在的 ID 可能很有用。

从可用性的角度来看,不告诉您的用户他们的 ID 是否存在是灾难性的。任何使用 ID 的网站都应至少确认一个 ID(ID 特定于您的网站,因此它们不会向垃圾邮件发送者提供太多信息)。不告诉您的用户电子邮件地址也是一个糟糕的主意:他们需要重新输入他们为每个电子邮件地址使用过的所有可能的密码。

问问自己用户访问您网站的频率。访问频率低会极大地放大可用性问题,以至于您可能希望为一年只连接几次的任何人启用通过文本或电子邮件而不是传统登录表单发送的一次性密码。

例如,我在工作中有两个不同的地址,不同子系统的多个密码和一个愚蠢的密码重置策略,除此之外,我还有我的个人电子邮件地址和大量不同的密码。对于我不经常访问的站点,可能需要数十次尝试才能找到正确的电子邮件/密码组合。

正如@William Forcier 所指出的,您可以通过多种方式了解电子邮件是否正在使用中

  • 帐户创建表格
  • 登录表单
  • 忘记密码表格

不过,您仍然可以为每种形式部署不同的防御措施。如果您决定绝对隐藏电子邮件地址,那么您可以在创建过多后将 (CAPTCHA) 帐户创建阻止/复杂化到特定 IP 地址。无论如何,您可能需要一种机制来防止垃圾邮件帐户(但请记住不要通过不可用的解决方案破坏实际用户的生活,例如系统地提供验证码)。