我有一个网站,用户可以登录以访问受限制的网页。我试图尽可能保证安全,所以我尝试遵循"最佳做法"。
为了降低对登录页面进行暴力攻击的风险,我只允许用户尝试登录一定次数。如果用户登录失败3次,则帐户被锁定,必须先解锁才能再次登录。
我的问题是,当帐户被锁定时,我是否应该在登录页面上告诉用户?
从可用性的角度来看,显示一条消息告诉用户该帐户已被锁定似乎是正确的做法。但这不意味着攻击者可以使用它来查找现有的用户名吗?
单次登录尝试失败后,我只向用户显示一条消息,"用户名和/或密码不正确",即我从未告诉用户确切的错误。我这样做是因为否则攻击者可以通过尝试大量的用户名来查找现有的用户名,并查看错误消息何时从"错误的用户名"到"错误的密码"。这是关于我读过的关于安全性的文章的推荐。但如果我在帐户被锁定时告诉用户,我不会在同样的情况下结束吗?攻击者可以尝试三次大量用户名,如果显示该帐户被锁定的消息,则攻击者知道该帐户具有该用户名。
我将始终向已被锁定帐户的用户发送电子邮件,但我相信用户不一定会立即看到,即使该帐户已被锁定,也可能会继续尝试登录。我认为这会在用户中产生一些烦恼,特别是如果他们知道他们使用了正确的凭据并且仍然收到凭据无效的消息(实际上帐户已被锁定,因此凭据不会出现在&#39 ;重要)。
那我该怎么做呢?你是如何自己实现的?
答案 0 :(得分:1)
从可用性的角度来看,显示一条消息告诉用户该帐户已被锁定似乎是正确的做法。但这不意味着攻击者可以使用它来查找现有的用户名吗?
取决于您如何实施它 - 如果您只显示有效帐户的消息,那么这将是username enumeration漏洞。
但是,如果您将所有登录尝试与用户表分开存储,那么您也可以为无效帐户显示虚假帐户锁定消息。
e.g。记录所有尝试
Date/Time Username Successful
06/06/14 10:00 foo false
06/06/14 10:01 foo false
06/06/14 10:02 bar false
06/06/14 10:03 foo false
其中bar
是有效用户且foo
不是 - 但如果有人尝试再次以foo身份登录,您可以检查日志的最后30分钟并显示{{1} }。
另请注意,如果您将其锁定,这也可能被视为针对有效用户的一种DoS攻击。更好的方法可能是针对相同用户名或来自相同IP地址的速率限制重复尝试。这应该是并行完成的,以防止攻击者使用多个线程来阻止你的限制。