如何限制Java Web应用程序中的登录尝试?

时间:2009-01-19 13:33:23

标签: java login throttling

我想实现一种有效的机制来限制我的Java Web应用程序中的登录尝试,以防止对用户帐户的暴力攻击。

Jeff explained the why, but not the how.

Simon Willison展示implementation in Python for Django: 这并没有真正帮助我,因为我不能使用memcached和Django。

从头开始移植他的想法似乎也不是很好 - 我不想重新发明轮子。

我发现了一个Java implementation,虽然它似乎相当简洁:它只是在15分钟后清除所有条目而不是LRU缓存。

EHCache可能是memcached的替代方案,但我没有任何使用它的经验,如果有更好的替代方案,我真的不想引入另一种技术。

那么,在Java中实现登录限制是一种好方法吗?

7 个答案:

答案 0 :(得分:7)

我认为即使是EHCache也会用凝固汽油弹炸死一只苍蝇。问题很简单,实施也是如此。

我建议在最顶层使用servlet过滤器,以便尽可能少地进行处理。

创建一个类来存储以下内容:

  • 尝试次数(次数)
  • 时间

现在,代码在sunchronized块中很简单:

if userid not in attemptMap:
    attemptMap.add ( userid, new attemptItem ( userid, 1, now ) )
else
    tmp = attemptMap.get ( userid )
    if (acquire lock for tmp) :
      if tmp.time + 30 > now :
          tmp.count = 0
          tmp.time = now
      tmp.count++
      if tmp.count > 3 :
          error=true
      release lock for tmp
    else : error=true

多才多艺(只要代码同步)。

答案 1 :(得分:1)

我刚刚完成了由方面安全性运行的网络安全课程,其中一项建议就是在任何登录尝试中包含一个自然延迟 - 理论是1秒或2秒延迟对于真实用户来说无关紧要,但会严重阻碍暴力攻击。

答案 2 :(得分:1)

未提及的一个是让他们在经过这么多不良尝试后输回忘记的密码问题+输入密码

答案 3 :(得分:0)

我使用了登录尝试计数字段和用户详细信息。当它达到50时,正确的密码被拒绝,用户必须重置密码。

答案 4 :(得分:0)

登录尝试之间的时间呈指数级增长怎么办?

答案 5 :(得分:0)

EHCache非常好,更重要的是不是由你写的,所以你不必重新实现功能,也可能让他们错了。

我的解决方案将涉及EHCache或更简单的东西(如果它是一个小应用程序,我并不真正关心并发性能)。

您可以按IP存储失败计数和时间戳。

  • 每次进行登录尝试时,请确定是否允许他们使用失败计数和时间戳。
  • 每次进行允许登录尝试并失败时,将失败计数增加1并记录失败时间。
  • 每次您进行允许的登录尝试并成功清除该IP的信息。

答案 6 :(得分:0)

保持错误的登录尝试次数,如果它将达到N,则阻止用户并要求重新设置验证码或密码。