我想实现一种有效的机制来限制我的Java Web应用程序中的登录尝试,以防止对用户帐户的暴力攻击.
杰夫解释了为什么,但不是如何.
Simon Willison 在Python中为Django展示了一个实现:这并没有真正帮助我,因为我不能使用memcached和Django.
从头开始移植他的想法似乎也不是很好 - 我不想重新发明轮子.
我发现了一个Java实现,虽然它似乎相当简单:它只是在15分钟后清除所有条目而不是LRU缓存.
EHCache可能是memcached的替代品,但我没有任何经验,如果有更好的替代方案,我不想真正引入另一种技术.
那么,什么是在Java中实现登录限制的好方法?
我想即使是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
这就是人(只要代码是同步的).