如何在 spring 启动和嵌入 tomcat 中设置 mod_reqtimeout?

How to set mod_reqtimeout in spring boot and embedded tomcat?

我有 spring 使用嵌入式 tomcat 的启动应用程序,我想设置 mod_reqtimeout 以防止缓慢的 http dos 攻击。我如何在 spring 引导配置中设置或初始化此模块?

acunetix 显示此警告:

您的网络服务器容易受到慢速 HTTP DoS(拒绝服务)攻击。 Slowloris 和 Slow HTTP POST DoS 攻击依赖于这样一个事实,即 HTTP 协议在设计上要求请求在处理之前完全被服务器接收。如果 HTTP 请求不完整,或者传输速率非常低,服务器会使其资源忙于等待其余数据。如果服务器占用太多资源,就会造成拒绝服务。

当我用谷歌搜索这个警告时,我看到应该设置 mod_reqtimeout,如下所示:

https://httpd.apache.org/docs/trunk/mod/mod_reqtimeout.html

我通过在下面注入这个 bean 并设置连接器的连接超时解决了问题:

@Bean
public EmbeddedServletContainerFactory servletContainerFactory() {
    TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();

    factory.addConnectorCustomizers(connector ->
            ((AbstractProtocol) connector.getProtocolHandler()).setConnectionTimeout(8000));

    return factory;
}

在 spring boot 1.4 或更高版本中,可以使用以下方法在应用程序属性中进行配置:

server.connection-timeout

Time that connectors wait for another HTTP request before closing the connection. When not set, the connector's container-specific default is used. Use a value of -1 to indicate no (that is, an infinite) timeout.

来源:https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html