如何在Java webapp中限制登录尝试?

Jör*_*rer 12 java throttling login

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

杰夫解释了为什么,但不是如何.

Simon Willison 在Python中为Django展示了一个实现:这并没有真正帮助我,因为我不能使用memcached和Django.

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

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

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

那么,什么是在Java中实现登录限制的好方法?

Lok*_*oki 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
Run Code Online (Sandbox Code Playgroud)

这就是人(只要代码是同步的).

  • @Jorn,他给你伪代码,这对你来说不够好? (7认同)

tdd*_*key 1

我刚刚完成了由方面安全性运行的网络安全课程,其中提出的建议之一是在任何登录尝试中都包含自然延迟 - 理论是 1 或 2 秒的延迟对于真正的延迟来说并不算什么。 -user 但会严重阻碍暴力攻击。