22

我正在为一个系统设计一个新的登录/注册过程,并希望将注册和登录的两个初始页面结合起来。

这将是一个用户输入电子邮件并按“继续”的页面。然后,我们会检查电子邮件是否被识别,如果被识别,我们会将用户推到“输入密码”页面,如果没有,则会将他们推到“注册”页面。

这有什么安全问题吗?显然,你可以输入一大堆电子邮件,并检查它们是否已在我们的系统中注册,但这是一个问题吗?我们有2FA用于注册帐户以及复杂的密码策略。

5
  • 这是一个很好的问题,我也经常看到这个问题。我想知道一个更安全的方法是否是:1。要求发电子邮件2。如果他们以前登录过,请使用本地存储/cookie动态获取密码字段3。如果没有本地存储/cookie告诉您他们以前登录过,那么通知他们,如果发现他们的电子邮件地址有帐户,那么他们会收到一封电子邮件(当然也会发送一封电子邮件)4。告诉他们,如果他们没有收到电子邮件,请单击下面的“注册”按钮。。。
    – MER公司
    评论 5月23日1:28
  • 4
    在登录页面上Jeff Atwood“告诉用户他们的电子邮件不存在”,以获得更好的用户体验 评论 5月23日3:23
  • 2
    值得一提的是,现在已经出现了相反的问题,注册成为登录:security.stackexchange.com/questions/134198/…。尽管是反向流,但它也有相同的漏洞。
    – 博布森
    评论 5月23日13:16
  • 有两个单独的页面可以更容易地为第二个页面呈现不同的工作流。
    – 王渊源
    评论 5月24日14:25
  • 1
    这不是一个安全问题,但从可用性的角度来看,这种设置很糟糕。现在要登录,我必须完成两个单独的页面加载,如果字段标记不正确,密码管理器通常会在这种设置中遇到问题。
    – 最大的
    评论 5月24日20:23

3个答案

重置为默认值
33

显然,你可以输入一大堆电子邮件,并检查它们是否已在我们的系统中注册,但这是一个问题吗?我们有2FA用于注册帐户以及复杂的密码策略。

2FA和复杂的密码无助于防止帐户泄露,只能防止使用这些帐户登录。特定电子邮件在您的网站上有帐户的信息可能很有价值,这取决于这是什么类型的网站。

除此之外,不明确用户的预期(即登录或注册)是一个可用性问题。我们不能期望所有用户都能准确地记住他们在该网站上是否有帐户,以及他们注册时使用的确切电子邮件(许多用户有多封电子邮件)。

如果用户希望登录,如果您要求他们注册而不是通知帐户不存在,他们会感到困惑。如果用户希望注册,他们会将您的密码问题视为注册时使用的密码问题,如果您告诉他们密码错误(因为登录失败),他们会感到困惑。

即使是要求发送电子邮件,然后在同一页面上同时提供“登录”和“注册”按钮的网站,用户也会感到困惑,他们会经常单击错误的按钮。

4
  • 在德语中更有趣的是,“anmelden”可以表示“登录”和“注册”,不同的网站都使用它。 评论 5月23日12:04
  • 2
    "我们不能期望所有用户都能准确记住他们是否拥有该网站的帐户“在我看来,我支持OP提出的集成自动登录/注册,而不是反对它。
    – 杰卡隆
    评论 5月23日15:25
  • 2
    @jcaron:不记得并不意味着用户没有线索,而是他们可能弄错了(可能在类似的网站注册,可能在这里注册,但使用不同的电子邮件,…)。在这种情况下,用户会发生错误的事情:他们可能会认为自己注册了,但随后会得到密码错误的信息,因为他们已经有了一个帐户,但使用了不同的密码。或者他们认为自己登录了(但使用了错误的电子邮件)并输入了密码,但最终却得到了一个新的注册。不通知用户实际会发生什么是不好的可用性。 评论 5月23日16:31
  • 您忽略了目录获取攻击对站点的重大影响发生。OP最好在登录和注册页面中加入验证码和/或某种节流。 评论 5月25日18:56
20

允许任何人检查某个特定电子邮件地址是否已在您的网站上注册,这既是一个隐私问题,也是一个安全问题。当然,这些信息对隐私的影响取决于网站内容的敏感程度。至于安全性,这是一个帐户发现。您允许攻击者查找有效帐户,并可能尝试在下一步中获得访问权限。这不必通过暴力攻击等显而易见的方法来实现。攻击者还可能使用网络钓鱼,在这种情况下,2FA和严格的密码规则没有多大帮助。

因此,从安全的角度来看,页面应该是分开的。还要确保您没有在注册页面上公开任何帐户信息。与其检查帐户是否已经注册并在网站上显示结果,不如发送一封电子邮件:如果地址是新的,请将用户链接到通常的注册程序。如果地址已经被使用,请在电子邮件中指出这一点,并允许用户在忘记密码后重置密码。

9
  • 1
    谢谢你提供的信息,它非常有用。那么网站是如何逃脱惩罚的呢?正如我看到的几个用例,例如。链接-还有什么形式的重述会有帮助吗?
    – 奥利
    评论 5月22日13:00
  • 2
    “那么,网站是如何逃脱惩罚的呢?”除了不必要的信息披露之外,他们并没有违反任何法律,这只是一种不良行为。重新捕获是一种可能的策略,但最好只在进行了几次不成功的尝试后触发。因为captcha令人恼火,并带来了可访问性问题。
    – 凯特
    评论 5月22日14:56
  • 1
    @奥利:不幸的是,账户枚举经常被忽视,要么是因为网站所有者不知道更多,要么是他们不在乎。这绝对是坏习惯。验证码可以降低攻击者的速度,但无法解决潜在问题。 评论 5月22日16:26
  • 4
    @凯特他们可以违反法律,取决于管辖权。。。你泄露了你的客户的私人信息(即他们是你的客户),这将与GDPR和其他人发生冲突。更准确地说,网站之所以能逃脱惩罚,是因为很少有人发出足够的噪音来解决问题。 评论 5月23日2:47
  • 1
    @巴尔马:请参阅我在第二段中的建议。在这两种情况下,应用程序都应该发送电子邮件:如果地址已经注册(这意味着邮箱的所有者已经有一个帐户),请在电子邮件中这样说。如果地址还没有注册,也可以在电子邮件中这样说,让用户完成通常的注册程序。 评论 5月23日15:12
10

您将威胁模型定义为:

攻击者获取系统中注册用户的列表。

无论您的UX/UI决定将登录/注册合并到一个页面中还是将它们分开,您都必须提供关于特定用户名(通常是电子邮件)是否已被使用的任何线索。

那么,如何平衡告诉合法用户他们想要的用户名正在使用,以及不向攻击者透露此类信息?

下面是一个示例流,假设登录/注册是一个单一的起点,他们的用户名是他们的电子邮件:

  • 如果用户名/密码匹配
    • 让他们登录
  • 如果用户名不存在用户名/密码不匹配
    • 一般消息,告诉他们登录失败,应该会收到一封电子邮件。如果他们没有帐户,则应遵循电子邮件中的注册程序
    • 向用户发送电子邮件
      • 该电子邮件将向最终用户揭示故障原因,例如:
        • 似乎您在{My site}登录失败,您还有5次登录尝试,或者可以在此处重置密码。如果您没有启动此登录尝试,请立即通知我们,因为可能有人试图登录到您的帐户。
        • 感谢您选择{我的网站}!若要完成注册,请单击包含唯一ID的此URL。如果您没有启动此注册,则可能有人正在尝试使用您的电子邮件进行注册。不是是否与共享此注册链接任何人

还可以考虑对登录/注册表单进行费率限制,这样您就不会意外地将服务器列入发送电子邮件的黑名单。

如果您不希望依赖不可靠的电子邮件进行此通信,则必须对用户进行分析,并推断出您认为这是与您的登录/注册表单交互的攻击者还是合法用户;想想reCaptcha。

2
  • 我对这封电子邮件感到困惑。系统如何知道向未注册用户发送什么电子邮件?还有,为什么要发送电子邮件?每次我输入错误的密码都会收到一封电子邮件,这会让我很恼火这么多. 评论 5月25日18:53
  • @ToddWilcox根据OP的威胁模型,假设系统使用电子邮件作为用户名。 评论 5月26日7:33

你必须登录来回答这个问题。

不是你想要的答案吗?浏览标记的其他问题.