如果用户在注册表中输入有效的登录信息,我应该登录吗?

信息安全 验证 登记
2021-09-04 10:58:38

最近,我们有用户抱怨他们忘记了他们有一个帐户,尝试注册,并收到错误消息,表明拥有此类电子邮件的用户已经存在。有一个建议在这种情况下只记录它们。因此,如果用户在注册表单中输入了有效的登录信息,他们就只是登录了。显然,如果密码不正确,用户将无法登录。

这种方法的安全隐患是什么?如果攻击者已经知道登录名和密码,他们无论如何都可以正常登录。大多数网站都没有这种行为,我的直觉是这不是一个好的做法,但我无法表达任何具体的反对意见。

4个回答

除非涉及其他身份验证方法(例如 2FA 等),如果一个正确的电子邮件和相应的密码足以让您登录,那么我认为没有安全问题。原因很简单:身份验证和授权过程没有改变。但是,例如,如果一个帐户启用了 2FA,并且第二个因素是登录所必需的,如果您允许用户从只接受电子邮件和密码的注册表单登录,您将引入一个弱点(因为它会可以绕过注册表单中的第二个因素),当然,除非您在启用 2FA 的现有用户注册后立即检查第二个因素。这可能会使您的应用程序更加复杂。

也就是说,我相信您提出的建议对于 UX(用户体验)来说通常是一个糟糕的选择。如果注册表中有其他字段,并且新数据与帐户中已保存的数据不同,会发生什么情况?例如,想想一个电话号码。您是否要在配置文件中自动更新它而不发出警告?您是否通过通知更新它?还是你会丢弃它?这个问题将引入步骤和选择,这将使您(和您的代码)和最终用户的一切变得更加复杂。此外,您必须区分已经拥有帐户但输入错误密码的用户,以及已经拥有帐户并输入正确原始密码的用户。你不能在没有通知的情况下直接登录,因为他们的体验会有所不同(新帐户的行为方式与已建立的帐户不同,并且会有不同的数据和设置)。除非用户了解您在做什么,否则他们中的一些人甚至可能想知道您的软件中是否存在错误并认为:“它只是让我登录是因为我使用了正确的密码,还是任何人都能够登录到我的使用此注册过程的帐户?”。

所以,正如我所说,我相信这会让你(和你的代码)和用户的事情变得复杂。如果您有大量的注册表单,并且想要避免用户在注册时浪费大量时间(如果他们已经有一个帐户),那么请确保您在注册过程的第一步或在注册过程中立即检查他们的电子邮件地址。后台通过 AJAX,因此用户会在开始填写所有字段之前发现他们已经有一个帐户。

从安全角度来看,您不应该向访问者透露给定名称下的帐户已经存在。

这样做,您的用户很容易受到帐户枚举攻击。

根据您网站的类型,这可能会泄露您的用户不需要的关联。想想 Asley Madison,用户通过测试他们的公共电子邮件地址被利用。

为了减轻影响,您可能希望使用任意用户名,或者使用带有某种验证码的注册表单,以至少阻止自动化。

因此,如果用户在注册表单中输入了有效的登录信息,他们就只是登录了。显然,如果密码不正确,用户将无法登录。

从合法用户的角度来看,这可能会带来混乱,除非他在成功登录时收到警报。
但是,通过注册表单允许登录,攻击面变得更广,因此您必须应用登录过程中存在的相同安全控制。

一些服务(我认为是 Slack?)会做类似的事情,这可能对用户更友好:当用户注册时,注册电子邮件总是会发送到他们的邮箱,无论该电子邮件是否链接到帐户。

不同之处在于,新用户会收到常规的“请激活您的帐户”电子邮件,而现有用户会收到“我们收到此电子邮件的注册请求,如果这是您,请在此处登录”类型的消息。或许您可以自动在此类电子邮件中添加一个短暂的“重设密码”链接,以帮助他们重新获得帐户。

通过这种方式,用户在这两种情况下都可以获得常规的“注册体验”(填写表格、转到电子邮件、单击链接、登录),而不会透露给定电子邮件的帐户是否存在(只有地址所有者才能获得此信息)信息,不是每个尝试创建帐户的人)。当用户忘记密码并且需要恢复他们的帐户(去邮箱两次)时,它会稍微复杂一些,但这也是一个相当典型的流程,所以它应该不会造成太大的混乱。

虽然您的提议不会增加任何安全风险,但此流程消除了您在注册表单中可能存在的客户电子邮件披露。