我想实现一种有效的机制来限制我的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中实现登录限制是一种好方法吗?
答案 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存储失败计数和时间戳。
答案 6 :(得分:0)
保持错误的登录尝试次数,如果它将达到N,则阻止用户并要求重新设置验证码或密码。