根据OWASP Auth准则,“无论用户ID或密码是否正确,应用程序都应使用通用错误消息进行响应。它也不应指示现有帐户的状态。”
但是,我发现许多流行的Web应用程序都显示一条该帐户不存在的消息,从而违反了该准则。
那么这是怎么回事? Google,Microsoft和Slack是否在做一些不安全的事情,或者OWASP指南没有用?
#1 楼
这是安全性和可用性之间的考虑,因此,这里确实没有正确的答案。因此,以下是我的看法。如果您可以将用户名保密,那就这样做。在这种情况下,无法确定用户名是否存在,并且无论用户是否存在,登录名都会做出相同的反应。请注意,这也意味着花费相同的时间返回错误消息。
此行为可能是不可能的。例如,如果用户可以注册自己并选择自己的用户名,则当系统中已经存在用户名时,您必须通知他们。在这种情况下,请提供最详细的错误消息,使登录尽可能易于使用。如果有人可以使用注册功能确定用户是否存在,则在登录时将其隐藏起来是没有用的。
评论
“如果有人可以使用注册功能确定用户是否存在,则在登录时将其隐藏起来是没有用的。” -您也可以通过重置密码功能,从公开个人资料列表(Twitter)或通过发送电子邮件并可能从邮件服务器(Gmail)收到“无法传递的邮件”错误来实现
–user11153
17年4月25日在14:36
“如果有人可以使用注册功能确定用户是否存在,则在登录时将其隐藏是没有用的”-除非注册是由验证码控制的,而登录则不是。
– John Dvorak
17年4月25日在14:37
@JanDvorak然后,这是登录时一个单独且相当严重的问题。如果没有办法限制登录尝试,那么您已经比“弄清楚用户名”严重得多。
–尼尔森
17年4月25日在15:40
@JanDvorak这就是为什么大多数确实会向您显示该帐户是否存在登录的网站在尝试几次失败后都会开始在登录时进行人机验证的原因-因此,您会尝试几次尝试,以获取有效的用户名,但是之后,验证码会使速度变慢。
–授予
17年4月25日在18:49
我接受此答案,因为此行总结为“如果您可以将用户名保密,那就这么做”。在某些企业系统中,注册功能对公众不可用,因此在某些情况下可以遵循OWASP。在我上面给出的示例中,可以轻松在登录页面之外找到这些帐户。
–styfle
17年4月26日在13:26
#2 楼
这不是唯一的OWASP准则,大型企业也没有遵循。 OWASP通常专注于安全性,而忽略了可用性。如果结合了体面的密码策略,暴力保护(锁定,验证码,..),MFA,监视失败的登录尝试等,它可能是一个有效的设计选择。请考虑该用户枚举不只是能够猜测用户帐户的问题,您以后可以通过蛮力进行身份验证。有些网站应保护其用户的隐私(成人,政党,约会等)。如果我想检查老板是否正在使用成人网站,则可以滥用用户枚举漏洞来了解他正在使用哪些网站。
评论
如果您知道某人的登录信息,则第二段的+1会非常好
– WoJ
17年9月2日在5:58
#3 楼
您就是无法阻止它。 (除非您准备牺牲大量可用性。)用户枚举可能是不受欢迎的,并且确实存在潜在的安全隐患(例如,如果攻击者发现有一个名为admin的有效帐户,他们可能会尝试访问)。但是对于大型网站,这是您无法阻止的事情。
即使您在登录过程中没有透露用户不存在,您最终也必须在尝试新用户时警告他们注册已经采用的名称或使用已经使用过的电子邮件地址。
没有一种用户友好的方法可以解决此问题:
评论
如果您只是向指定地址发送一封电子邮件,说明某人已尝试设置一个帐户,以及该地址是否已经存在一个电子邮件,那么肯定已经不是问题。但这不会阻止他们找出用户名是否正在使用,尽管电子邮件会使其速度变慢。如果您不介意为他们提供随机数字后缀以附加到其名称,则它们也将无法探测现有名称。
– PJTraill
17年4月25日在16:46
这也取决于服务。在Ashley Madison类型的门户网站上,您不想确认是否登录了电子邮件地址。对于用户名“ tom”,这不是问题。
–eckes
17年4月26日在0:30
这就是为什么我说“没有用户友好的方式”。我的主要观点是,对于大多数应用程序而言,此问题不应成为重中之重。我知道的所有主要平台都允许以一种或另一种方式枚举用户和电子邮件地址。
– Arminius
17年4月26日在20:13
@grochmal:完全没有意义。如果其他人可以获取完全相同的电子邮件地址,您将如何向他人发送电子邮件?
–user21820
17年4月27日在10:36
@ user21820-我根本没有提到电子邮件。它只是用户名和用户ID。然后,用户可以添加或不能添加可以与其联系以获取密码重置和类似内容的电子邮件。我看到了这个实现(仍然很可怕)。
–grochmal
17年4月27日在13:00
#4 楼
安全是相对的。不提供有关该帐户是否存在的信息稍微安全些。但这并不意味着提供这些信息是不安全的。它只是不太安全,所以只有很少的安全。在您给出的示例中尤其如此;还有其他查找帐户名称的方法,因此试图隐藏该帐户是否存在没有任何好处。 ,并且需要其他控件。
#5 楼
我同意@Silver的回答,但想扩展。请记住上下文; OWASP指南是作为非安全专家的开发人员的经验法则。如果软件开发公司拥有一支由顶级安全架构师组成的团队,那么只要他们了解规则背后的意图并以其他方式减轻风险,就不必盲目遵循经验法则。类比:您应该每3个月或5,000公里更换一次汽车机油,但是汽车修理工在知道自己的驾驶习惯很好时,经常将其推长。
关于这里的细节,我不是用户枚举漏洞的专家,我也不知道为什么Google和Microsoft会做出他们所做的决定,但是我假定他们已经设置了限速和黑名单以防止大规模的用户枚举攻击,否则认为用户的便利值得增加风险。
#6 楼
很难说它们违反了OWASP指南,因为对于Google,Microsoft之类的应用程序和服务,它们需要尽可能“符合用户要求”。 2FA协议。评论
仅作为准则时,谈论侵权可能太难了。)
–eckes
17年4月26日在0:28
#7 楼
不公开活动用户标识符的目的是防止枚举大量帐户。严格来说,您可以通过允许重复帐户来防止这种情况的发生,但这是一个糟糕的设计,并且会导致您遇到各种麻烦。
执行此操作的另一种方法是为用户分配一个标识符-构造一个未使用的标识符。但这是一种糟糕的可用性体验,可能不值得*。
降低风险的明智方法是实施任何反枚举功能-例如,高质量的验证码,放慢任何枚举尝试。这样的设计是相当安全的。
那么,剩下的风险就是您没有打开对一个非常高价值的帐户的验证-例如,barack.obama @ gmail.com。然后,您还可以通过实施针对密码破解尝试等的控制措施来减轻这种风险。
* Salzer and Shroeder,计算机系统中的信息保护,第IA3)h)节,心理可接受性注意:人性化界面的设计必须易于使用,以便用户定期自动正确地应用保护机制。同样,只要用户的保护目标心理形象与他必须使用的机制相匹配,就可以最大程度地减少错误。如果他必须将自己的保护需求形象翻译成完全不同的规范语言,他会犯错误。
评论
请注意,所有这些仅在输入用户名后才要求您的身份验证凭据(例如密码)。正确。似乎他们对输错帐户以立即通知他们的用户很友好,但这显然违反了OWASP指南。
关于这个问题的变化已经被问过很多次了。甚至还有一个用于用户枚举的标签
“在用户的电子邮件不存在时告诉用户”
如果要确定是否存在帐户,只需尝试使用该用户名进行注册。