OWASP suggests防止暴力密码猜测的一个可能的对策是在检查密码时添加人为延迟.
抛开关于此类方法与临时锁定帐户等的有效性的任何问题,我如何在Spring Security AuthenticationProvider中实现它,而不会创建一个攻击者很容易快速使用每个Web服务器线程的情况? (如果我在authenticate方法中添加了Thread.sleep(),那就是我想象的那样)
最佳答案
EDIT
随着Servlet 3.0的出现,为异步处理支持添加了支持,添加人工延迟变得简单.
问题:不支持异步处理的中间过滤器
解决方案:在任何不兼容的过滤器潜入并应用我们添加延迟的逻辑之前,在过滤链基础上添加额外的AttmeptFilter.
我们不再只依赖javax.servlet.ServletRequest#startAsync()的超时,而是为javax.servlet.AsyncContext添加自定义超时.
我们当前使用的方法是一个额外的过滤器,我们在满足阈值时检查对远程主机地址组合的主体尝试失败次数.
失败尝试的次数由专用服务管理,该服务侦听每个AbstractAuthenticationEvent并根据结果操作尝试.
特定主体和主机地址的尝试被最外层过滤器阻止,并且在指定时间内可能进行最少的检查(甚至没有达到弹簧安全性),并且阻塞时间随着失败尝试次数的增加而增加.
由于远程主机和主要组合被阻止,由于帐户锁定和其他解决方案,它不会影响真正的用户Web体验.
我已经做了粗略的样品申请,让你的想法更清晰
在github上查看代码
https://github.com/yourarj/spring-security-prevent-brute-force
原油建筑概述