如果帐户被锁定,向用户显示消息是否安全

信息安全 Web应用程序 验证
2021-08-25 10:35:19

我正在开发一个 Web 应用程序,安全性是重中之重。因此,如果用户登录失败超过 3 次,则该帐户将被锁定。我应该向用户显示“您的帐户已被锁定”的消息吗?这将有助于攻击者获取用户名。

4个回答

虽然@Simon 的回答非常好,但我想补充一点。不要因为登录尝试失败而锁定用户帐户

通过这样做,您将在您的应用程序中引入一个巨大的 DoS 漏洞。任何恶意攻击者都可以通过重复登录过程失败来简单地锁定大量用户。您还将引入一个很大的支持难题,因为用户无法登录过程。有时反复。记住 CIA 三角形的第三个方面,可用性。如果没有人可以使用,您的应用程序将毫无用处。

相反,您应该做的是限制允许的登录尝试次数。引入“超时”期限,而不是永久锁定用户的帐户,等待用户部分的某些操作。这将充分阻止在线暴力攻击,同时将支持电子邮件和电话保持在正常水平。

如果您收到大量密码尝试,您需要锁定攻击者,而不是受害者这应该是显而易见的,但无论如何这是一个非常普遍的问题。

首先,减缓攻击。即使在一次错误的密码尝试之后,发送尝试的 IP 也应该在几秒钟后才能提交另一个密码。您可以通过显示“正在验证,请稍候...”消息在浏览器端对此进行屏蔽。但是在后端,如果您在给定 IP 的单个N秒跨度内进行了多次尝试,则返回一条错误消息,让攻击者知道您甚至不会检查他的猜测是否正确。

对于奖励积分,需要N秒的沉默,而不仅仅是第一次猜测后的N秒。这样在服务器上跳动只会延长超时时间。

其次,阻止有问题的 IP,而不是被冒犯的帐户。您可以轻松地从前一点扩展您的解决方案,以增加N次尝试失败后的等待时间。因此,例如,10 次尝试,您将在禁区内获得额外的 15 分钟。您甚至可以在您的网页上显示一个友好的倒数计时器。告诉人们“还剩 3 次尝试”也很有帮助,这样他们就可以考虑自己键入的内容,并且不要仅仅敲打错误的密码,直到他们被锁定。

第三,通过降低对机器人的友好性来应对攻击。如果一个帐户引起了数百个 IP 的关注,您可以改变一些东西来破坏机器人。例如,提出验证码挑战。真正的用户可能会觉得这很烦人,但并不被您的帐户锁定那样烦人。

您必须告诉用户该帐户已被锁定,否则如果不直接在 Web 应用程序中显示消息,我看不出您将如何处理这种情况。当然,您很可能会向他发送一封电子邮件,其中包含一些解锁他的帐户的步骤,但您仍然必须在应用程序中通知用户您已向他发送了一封电子邮件。

现在,考虑到您的主要担忧是攻击者可能会在您的网站上构建已注册用户名的列表,因此有一种解决方案可以缓解此问题。

通过 cookie/隐藏字段/数据库条目跟踪尝试

每当用户尝试使用不存在的用户名登录时,您可以通过将信息存储在 cookie、隐藏字段甚至直接存储在数据库中来跟踪他的失败尝试。这样,如果您在 3 次尝试失败后锁定真实帐户,您可以跟踪失败的尝试(这不是真正的失败尝试,因为用户名并不真正存在)并显示锁定消息,就像在真实帐户中一样情况。

实现这一点的最透明和最有效的方法是在数据库中插入失败的尝试,因为用户总是可以修改隐藏字段和 cookie,这最终可以帮助他找出你的小诡计。此外,如果用户使用 cookie 和隐藏字段尝试了许多用户名,则可能很难跟踪不存在的用户名尝试。但是,在数据库中,您可以简单地记录用户的 IP、不存在的用户名以及最后失败的尝试次数,这将告诉您是否必须向您的 Web 应用程序显示假锁定消息。

您可能也不想仅按 IP 过滤尝试,以防攻击者使用代理并测试相同的用户名并注意到它再次占用了他,例如,3 次尝试锁定帐户。再一次,他可以像这样算出你的诡计。

但是,你真的需要这样的保护吗?

在实施此类保护之前,请花一些时间考虑它是否真的对您的 Web 应用程序有必要。这完全没用的情况是一个网站有一个论坛,用户使用与该论坛上显示的用户名相同的用户名登录。显然,恶意用户可以很容易地通过浏览页面来建立注册用户列表。

使用电子邮件地址登录

如果可能的话,您是否考虑过使用用户的电子邮件地址来连接您的 Web 应用程序?有人尝试建立电子邮件地址列表的可能性要小得多,因为有比用户名更多的可能性(用户倾向于选择典型和简单的用户名,例如可用时的“Simon”。但是,找到 Simon 的 e - 邮件地址更难,因为假设他再次选择用户名“Simon”,有许多可能的电子邮件服务(例如 Simon@gmail.com、Simon@hotmail.com、Simon@yahoo.com 等)) .

不显示错误信息并没有增加太多的安全性,反而是一个持续的糟糕的用户体验,因为它很方便用户知道登录输入有什么问题。如果您的系统需要高安全性,您可以使用超时惩罚系统和更好的密码框架。