从几个来源(1 2 3),我得到的印象是,每当人们想要对限额请求进行评分时,这种趋势似乎是&#34 ;将Tomcat包装在Apache之后,并对Apache"进行速率限制。还有iptables解决方案,但是它不会回答HTTP 429("太多请求")。
Apache很好,但是如果我们可以即兴地对我们拥有的小型servlet进行小规模部署会很好,但是我们仍然被要求对限制请求进行评级,并且设置Apache层似乎有点矫枉过正(至少与克隆一个我们已经在做的web.xml文件相比)。
因此,我正在考虑编写一个小型过滤器来实现这一点(因为它似乎是非常大的努力)并将其与servlet打包在一起,但奇怪的是没有精心设计的Tomcat速率限制过滤掉了在公开场合表明这种做法可能是天真的。我的意思是,这种感觉非常通用,而且这些天开源很多。所以也许有一个很好的理由证明Apache解决方案的合理性。 Apache has so many options而Tomcat似乎没有。
(Jetty does seem to ship with one such filter though,尽管是一个servlet容器。)
为什么Tomcat缺少内置的速率限制过滤器?
答案 0 :(得分:1)
Tomcat 通常用作另一个 Web 服务器(也称为反向代理)后面的应用程序容器,它可以更有效地实现某些功能,例如 TLS 卸载、提供静态资源或将负载(例如负载均衡器)分散到多个 Java 进程或多个进程Web 应用程序,尽早有效地阻止攻击更有意义。此外,servlet 过滤器不能用于多个 Web 应用程序。
但是Tomcat有一个很好的机制叫Valves,可以用来实现限速,完整的实现见:
https://github.com/ihbrune/Anti-DoS-Valve
不利的一面是,Valve 仍然是特定于 Tomcat 的,而过滤器可移植到其他 Web 容器,具体取决于您的应用程序框架,例如Spring MVC 框架可能会提供类似的选项,例如拦截器,您可以将其与用于限速的库相结合,例如:
https://github.com/vladimir-bukhtoyarov/bucket4j
因此您可以编写自己的自定义逻辑,例如检查失败登录尝试的数量,以防撞库攻击
答案 1 :(得分:-1)
Tomcat确实内置了rate-limit filter valve。您只需修改它以满足您的需求。