项目场景:
扫描到的漏洞截图:
攻击原理:
Web应用在处理HTTP请求之前都要先接收完所有的HTTP头部,因为HTTP头部中包含了一些Web应用可能用到的重要的信息。攻击者利用这点,发起一个HTTP请求,一直不停的发送HTTP头部,消耗服务器的连接和内存资源。抓包数据可见,攻击客户端与服务器建立TCP连接后,每10秒才向服务器发送一个HTTP头部,而Web服务器在没接收到2个连续的\r\n时,会认为客户端没有发送完头部,而持续的等等客户端发送数据。如果恶意攻击者客户端持续建立这样的连接,那么服务器上可用的连接将一点一点被占满,从而导致拒绝服务。这种攻击类型称为慢速HTTP拒绝服务攻击。
解决方案:
使用connection-timeout控制超时时间,不同的Spring Boot版本配置有些不同。
Spring Boot2.1.9.RELEASE之前(包含),2.1.9.RELEASE官方文档
在application.properties添加配置:
# 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.
# 连接器在关闭连接之前等待另一个HTTP请求的时间。如果未设置,则使用连接器容器特定的默认值。使用值-1表示没有(即无限)超时。
server.connection-timeout = 10000
Spring Boot2.2.0.RELEASE之后(包含),2.2.0.RELEASE官方文档
在application.properties添加配置:
# Amount of time the connector will wait, after accepting a connection, for the request URI line to be presented.
# 连接器在接受连接后等待呈现请求URI行的时间量。
server.tomcat.connection-timeout = 10000
总结:
这里的connection-timeout是建立TCP连接并读取HTTP报文的超时时间,并不是整个HTTP请求的超时时间,接口响应超时跟这个没关系,所以它对业务逻辑的执行没有影响。
附加:
还可以优化下tomcat的线程数与连接数,这里Spring Boot高版本低版本配置相同。
# 最大连接数,默认10000
server.tomcat.max-connections=2000
# 最大线程数,默认200
server.tomcat.max-threads=2000