根据OWASP Auth Guidelines,“无论用户 ID 或密码是否不正确,应用程序都应以通用错误消息进行响应。它也不应指示现有帐户的状态。”
但是,我发现许多流行的网络应用程序通过显示该帐户不存在的消息而违反了该准则。
那么这里发生了什么?谷歌、微软和 Slack 是否在做一些不安全的事情,或者 OWASP 指南没用?
根据OWASP Auth Guidelines,“无论用户 ID 或密码是否不正确,应用程序都应以通用错误消息进行响应。它也不应指示现有帐户的状态。”
但是,我发现许多流行的网络应用程序通过显示该帐户不存在的消息而违反了该准则。
那么这里发生了什么?谷歌、微软和 Slack 是否在做一些不安全的事情,或者 OWASP 指南没用?
这是安全性和可用性之间的考虑,因此这里没有真正的正确答案。所以这里遵循我的意见。
如果您可以将用户名保密,请这样做。在这种情况下,无法确定用户名是否存在,无论用户是否存在,登录都会做出相同的反应。请注意,这也意味着要花费相同的时间来返回错误消息。
这种行为可能是不可能的。例如,如果用户可以注册自己并选择自己的用户名,则当系统中已经存在用户名时,您必须通知他们。如果是这种情况,请通过提供最详细的错误消息使登录尽可能易于使用。如果有人可以使用注册功能确定用户是否存在,那么在登录时隐藏它是没有用的。
这不是唯一没有被大玩家遵循的 OWASP 指南。OWASP 经常关注安全性而忽略可用性。如果结合合适的密码策略、蛮力保护(锁定、验证码、..)、MFA、监控失败的登录尝试等,它可能是一个有效的设计选择。
考虑到用户枚举不仅仅是能够猜测用户帐户的问题,您可以稍后对其进行暴力验证。一些网站应保护其用户的隐私(成人、政党、约会……)。如果我想检查我的老板是否在使用成人网站,我可以滥用用户枚举漏洞来了解他正在使用哪些网站。
安全是相对的。不提供有关帐户是否存在的信息会稍微安全一些。但这并不意味着提供这些信息是不安全的。它只是不太安全,而且只是非常轻微。
在您给出的示例中尤其如此;还有其他方法可以找到帐户名称,因此尝试隐藏帐户是否存在没有任何好处。
与任何形式的匿名安全一样,隐藏帐户名称是一种较弱的安全控制,需要其他控制。