我正在为我们的下一个项目评估 Spring WebFlux + R2DBC 堆栈。考虑一下 REST 响应流的教科书代码:
@GetMapping("items")
public Flux<Item> findAll() {
return repository.findAll();
}
存储库使用 jOOQ 执行数据库查询,但我认为这个细节与问题无关。我担心如何通过缓慢消耗 REST 响应或完全完全删除网络连接来防止 REST 客户端无限期地保持数据库连接。
如果我的数据库连接池有 20 个连接,攻击者可以触发 20 个并发 REST 调用,然后立即离线。这会使我的应用程序无响应。更糟糕的是,它会无限期地无响应,因为据我所知,Spring 6 WebFlux 默认情况下不会配置 HTTP 响应或套接字读/写超时,并且似乎没有可用的配置选项来设置这些超时。
显然,我一定是遗漏了一些东西或者误解了它是如何工作的。有人可以解释如何减轻这种风险吗?
您可以应用其中一些与 OWASP 相关的措施,并且您可以采取一些措施来避免 DOS 或 DDOS 攻击。
例如:
设置池中的连接数或根据需要减少连接数。
创建读写超时,不让连接长时间处于活动状态。
速率限制或背压处理。
尖峰逮捕
实施峰值抑制策略:为此,您可以使用像resilience4j这样的工具,它可能会切断连接以避免服务中断。 (断路器模式)。
你应该有一个像这样的配置文件:
spring:
webflux:
server:
max-idle-time: 30s
max-life-time: 60s
max-connection-time: 30s
r2dbc:
pool:
max-size: 20
server:
reactive:
session:
timeout: 30s