2

我们的注册表单上有使用 AJAX 调用来检查用户名是否可用的功能。

这很简单

  • 拨打我们的服务电话
  • 对照数据库检查用户名
  • 如果找到用户名记录,则返回,否则返回可用。

一旦用户停止输入几秒钟,我们就会执行对我们服务的调用。

然而,我们的问题是,攻击者可以对我们的服务使用某种蛮力手段并编译我们所有用户名的列表。

有谁知道任何帮助防止这种“攻击”的好方法?

我唯一能想到的就是预先要求验证码,但这不会是一个好的用户体验,并且可能会让人们无法填写我们的表格。

如果它有帮助,我们正在使用 ASP.NET MVC、C#、SQL Server。

任何帮助将不胜感激,谢谢!

4

3 回答 3

1

我想最好的方法是限制它的速率,要么只允许用户一定数量的请求,要么给每个请求增加 0.5-1 秒的等待时间。通过执行其中任何一项操作,攻击者将很难在合理的时间内枚举出相当数量的用户名。

但是,我认为保护您的应用程序的更好方法是将其视为每个人都已经拥有您的用户列表并从那里开始工作。假设攻击者了解您的所有用户,您将如何防范暴力攻击?通过速率限制密码尝试。通过每 10 分钟左右只允许几次密码尝试,您将大大保护您的应用程序的用户。

我个人认为所有非显而易见的密码(例如“密码”和“qwerty”)都应该是安全的 - 例如,“soccerfan”应该是安全密码。为什么?因为您不会立即猜测“足球迷”。在您的暴力破解者的字典中,它可能会排在第 100 位左右,并且当他们猜测尝试使用接近该数量的任何地方登录时,他们应该被禁止并且应该已经通知用户。(顺便说一句,我并不是建议人们应该使用这样的密码,越复杂越好)。

于 2012-05-11T14:52:23.867 回答
1

您可以检查 ajax 请求是否来自同一来源,并在那里设置某种限制,您还可以对请求进行签名。

通过节流,我的意思是,例如一个 IP 地址每天最多允许 10 个请求。

于 2012-05-11T14:52:33.353 回答
1

另一种方法是让客户端计算一些需要几秒钟的东西。

在服务器端,可以用很少的 CPU 资源检查计算值。并且仅当客户端计算的结果正确时才处理请求。

这种算法被称为陷门函数

于 2012-05-11T14:58:25.003 回答