AJAX检查用户名函数的安全性

AJAX检查用户名函数的安全性,ajax,security,Ajax,Security,我们的注册表单上有一个功能,它使用AJAX调用检查用户名是否可用 这很直截了当 给我们的服务打个电话 根据数据库检查用户名 如果找到用户名记录,则返回,否则返回可用 一旦用户停止输入几秒钟,我们就会执行对服务的调用 然而,我们的问题是,攻击者可以对我们的服务使用某种暴力手段,并编译我们所有用户名的列表 有人知道有什么好方法可以帮助防止这种“攻击”吗 我能想到的唯一一个办法是要求事先提供验证码,但这不是一个好的用户体验,可能会让人们不愿意填写我们的表单 如果有帮助的话,我们正在使用ASP.NE

我们的注册表单上有一个功能,它使用AJAX调用检查用户名是否可用

这很直截了当

  • 给我们的服务打个电话
  • 根据数据库检查用户名
  • 如果找到用户名记录,则返回,否则返回可用
一旦用户停止输入几秒钟,我们就会执行对服务的调用

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

有人知道有什么好方法可以帮助防止这种“攻击”吗

我能想到的唯一一个办法是要求事先提供验证码,但这不是一个好的用户体验,可能会让人们不愿意填写我们的表单

如果有帮助的话,我们正在使用ASP.NETMVC、C#和SQLServer


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

我认为最好的方法是对其进行评级限制,要么只允许用户执行一定数量的请求,要么在每个请求上增加0.5-1秒的等待时间。通过执行这两种操作之一,攻击者将更难在合理的时间内枚举相当数量的用户名

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


我个人认为所有不明显的密码(如“password”和“qwerty”)都应该是安全的——例如,“soccerfan”应该是安全的密码。为什么?因为你不会马上猜到“足球迷”。在你的蛮力词典中,这可能是第100个左右,当他们猜到试图以接近这个数量登录时,他们应该被禁止,并且应该通知用户。(顺便说一句,我并不是建议人们使用这样的密码,越复杂越好)。

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


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

另一种方法是让客户端计算需要几秒钟的内容

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


这种算法称为

谢谢Tim。我很喜欢你的两个想法。嗨,凯斯,非常感谢。为了以防万一,你还没有看到,我补充了一点关于我个人对密码安全的看法,以及我认为解决这个问题的更好方法。我还考虑添加一些虚拟帐户以及一个触发器,如果有人试图使用其中一个虚拟帐户登录,我们将收到通知。虽然我不太确定收到通知后我们会怎么做,但请禁用尝试过的IP地址?问题是,禁用IP后,许多人可能会使用公共IP地址后面的计算机,可能使用类似
http://www.stopforumspam.com/
http://akismet.com/
API在坏用户尝试制作ajax callI之前就将其剔除。我不会永久禁止IP,但可能会在3天左右?这应该足以让攻击者失去兴趣。我仍然认为最好的方法是假设所有攻击者都有完整的用户名列表。至于虚拟账户,我个人不会介意,虽然它可以工作。谢谢罗伯特,我肯定也会调查的。