在我的网站的帐户创建表单上,如何避免泄露电子邮件地址已经有帐户的信息?

信息安全 账户安全
2021-08-14 06:25:16

当由于不正确的电子邮件/密码组合而拒绝访问用户时,似乎很常见的做法是不指定哪个用户名或密码不正确。这样可以避免泄露帐户在该电子邮件地址中存在或不存在的信息。

例如,如果我尝试在约会网站上使用我配偶的电子邮件地址登录,并且错误消息是“密码错误”而不是“此电子邮件地址没有帐户”,我可以得出必要的结论。

但是如何避免在帐户创建表单上出现相同的信息泄漏,我必须阻止用户使用已经拥有的电子邮件地址创建帐户?

4个回答

我可能很愚蠢并且不理解这个问题,但在我看来,通过仅通过电子邮件提供必要的信息(攻击者不应该能够访问),可以很容易地避免这个问题。如果您不想泄露任何信息,那么无论电子邮件是否已被使用,公共消息都必须不可区分。如果你真的要小心,从技术上讲,你还应该确保响应时间是相同的,以避免定时攻击。但是,根据您的需要,这可能是矫枉过正。

所以会发生什么:

  • 如果该电子邮件尚未使用,您会显示一条消息,例如“感谢您的注册,现在去检查您的电子邮件以完成该过程”该电子邮件将包含一个用于验证地址的链接,当用户单击它时,将创建并启用该帐户。您也可以在验证之前立即创建帐户,但您需要确保攻击者无法检查它是否已创建(否则会泄露信息)。

  • 如果该电子邮件已被使用,那么您会显示相同的消息(请参阅上面的点),例如“感谢您注册,现在去检查您的电子邮件以完成该过程”这样,攻击者将不会获得任何额外的信息。电子邮件地址是否已被使用?攻击者无法知道,除非他们可以阅读电子邮件。但是用户会知道,因为这次你通过电子邮件发送的信息不同,可能是这样的:“你刚刚尝试使用这个电子邮件地址在 example.com 上注册,但是你已经有一个连接到这个电子邮件地址的帐户. 你忘记密码了吗?胡说八道。如果不是你,请丢弃这条消息“

因此,攻击者将无法了解帐户是否已使用特定电子邮件地址注册,除非他们有权访问该电子邮件地址。相反,用户,因为他们应该可以访问电子邮件地址,所以他们将能够获得他们需要的所有信息,无论他们是正确注册还是尝试注册两次。

我有一个想法:在创建表单上,只要求一个电子邮件地址。提交后,立即向该地址发送一封电子邮件,包括指向允许用户选择/重置密码的页面的链接。

在页面上,显示一条消息,例如“一封电子邮件已发送到您的地址,以验证您的帐户或重置您的密码。”

首次密码选择和密码重置本质上是一回事,无论如何都需要验证电子邮件地址。

这是一个更大的问题,然后看起来。我将尝试关注隐私方面,而不是工程方面。

考虑到Ashley Madison 泄密以及个人和/或公司受到的影响,这种情况并非完全不可信。

这里的核心问题是:

  1. 在没有一些半唯一的公开身份信息的情况下,我如何提供安全的体验?
  2. 我可以向用户提供某种程度的合理否认吗?
  3. 密码恢复的可能性很大的情况下,我如何在一定程度的隐私下处理这个问题?

出于这个问题的目的,我将继续理解我们是:

  • 试图减轻随意或广泛的“外出”
  • 防止将用户信息链接到真实的人

困难的部分是一个帐户本质上通常需要是唯一的,并且与某人相关联。此外,它需要使用诸如密码之类的东西来保护对话的私密性(“你知道的东西”)。

为了增加一些额外的保护,只允许那些拥有帐户的人查询其他用户。所有服务和功能都隐藏在登录屏幕后面。您如何决定实施注册是一个单独的问题。这个想法已经在几个服务上实现了,但它的效果如何尚不清楚。您还必须避免在任何地方列出帐户创建日期/时间。这满足第 2 点和第 3 点,而无需处理 1。

最简单的方法是强制用户不要使用公共电子邮件服务或电话号码。同样,如何实现这是一个软件工程问题。您将不得不与希望滥用该平台的机器人或用户打交道。这满足第 1 点和第 3 点,也不太可能满足第 2 点。

应用程序/用户如何在中国中部审查中获得灵感,为每个用户分配一个“随机”ID。这些可能是 8-12 位长,因此它们既足够独特又易于记忆。在用户大脑和数据库之外的任何地方拥有此 ID 的副本可以将两者联系起来,从而破坏获得的任何隐私。这意味着没有电子邮件、没有电话、没有“自拍”或任何类似的东西。当用户随时更改时,用户可以为自己分配一个面向公众的名称,指向一个通用的“不存在”页面。

中国市场的 Steam 客户端预览版仅显示数字用户名

为了获得某种程度的合理否认,您可以采用“不注册”流程。用户可以将多个帐户绑定到一个电子邮件地址或电话号码,而无需验证流程。每次有人希望“注册”时,都会分配一个随机 ID,并且只显示一次。从那里访问该帐户,您需要提供“秘密”ID 和密码。该系统将允许您为每个电子邮件地址或电话号码注册一定数量的帐户,但比通常的 1 对 1 映射要多。最后两段满足第 1 点和第 2 点,但不满足第 3 点。

这个问题问得好。在我看来,我们需要澄清您使用什么来识别用户。它是电子邮件地址、用户选择的用户名还是您提供给用户的用户名。以上每一项都必须以不同的方式处理。如果您将电子邮件用作帐户标识,则数据泄漏更为重要。请记住,电子邮件被视为敏感数据。这可能会导致您的应用程序泄露用户的电子邮件地址。如果使用用户名,那么在我看来泄漏并不那么重要,因为用户通常使用不被视为敏感数据的别名,并且没有真正的隐私问题。

话虽如此,如果在注册过程中您通知攻击者An account already exist with this username您给攻击者一个小提示,那么问题仍然存在,他试图钓鱼或暴力破解用户密码的努力并非没有意义。

所以,我们能做些什么?
我个人的建议是要求 3 个字段username, email, password。用户名和电子邮件地址都应该是唯一的。这意味着数据库中不能有多次相同的用户名。电子邮件也一样。这样,您可以让一个用户username = bill使用email=bill@some_domain.com

  • 示例
    假设已经存在具有以下凭据的用户。
    Username=bill+email= bill@some_domain.com
    下面的组合应该都是无效的。
  1. Username=other_username + email= bill@some_domain.com
    • 消息 --> 用户名或电子邮件无效
  2. Username=bill + email= other_user@some_domain.com
    • 消息 --> 用户名或电子邮件无效
  3. Username=bill + email= bill@some_domain.com
    • 消息 --> 用户名或电子邮件无效

当用户尝试登录时,两个值中的一个应该足以输入 + 密码。在您的数据库中,提交的用户名可能如下所示: system_username = username+email例如: system_username = bill,bill@some_domain.com *(这可能会导致性能问题)

  • 如何缓解 如果麻烦或更多,数据库的当前架构不允许这样的更改,那么在登录部分应用相同的主体。
  1. 在注册完成之前等待一段时间。(蛮力需要更多时间)
  2. 限制创建帐户请求。和更多..

编辑:正如没人在下面的评论中指出的那样, 当输入一个大的随机用户名时,此解决方案存在问题。)