【发布时间】:2017-01-30 18:50:35
【问题描述】:
我有这样的情况。假设有一个公共 REST 服务。我们不希望有人能够在短时间内多次访问此服务,因为他们将能够阻止我们的数据库(我想这本质上是 DDOS 攻击?)。
有没有办法有效地防范这种类型的攻击?我们使用的技术是 Spring/Spring Security。
【问题讨论】:
标签: java spring security spring-security ddos
我有这样的情况。假设有一个公共 REST 服务。我们不希望有人能够在短时间内多次访问此服务,因为他们将能够阻止我们的数据库(我想这本质上是 DDOS 攻击?)。
有没有办法有效地防范这种类型的攻击?我们使用的技术是 Spring/Spring Security。
【问题讨论】:
标签: java spring security spring-security ddos
如果你使用 Spring Boot 有一个相当新的开源项目可以处理这个问题:
https://github.com/weddini/spring-boot-throttling
对 Spring 服务进行节流控制的声明式方法。 @Throttling 注解帮助你限制服务方法的数量 每个 java.util.concurrent.TimeUnit 对特定用户 IP 的调用 地址、HTTP 标头/cookie 值或使用 Spring 表达式语言 (SpEL)。
显然这不会阻止网络服务器级别的 DDOS 攻击,但它有助于限制对长时间运行的查询的访问或实施公平使用策略。
【讨论】:
对于那些对该主题感兴趣的人,spring-boot-throttling 似乎不再维护。
所以,我看看bucket4j
使用很简单:主要有3个对象:
简单的 Spring Boot 控制器示例:
@RestController
public class TestLimit {
private Bucket bucket = null;
public MsGeneratorController() {
Bandwidth limit = Bandwidth.classic(120, Refill.greedy(120, Duration.ofMinutes(1)));
this.bucket = Bucket4j.builder().addLimit(limit).build();
}
@RequestMapping(path = "/test-limit/", method = RequestMethod.GET)
public ResponseEntity<String> download() throws IOException {
if (this.bucket.tryConsume(1)) {
return ResponseEntity.status(HttpStatus.OK).build();
}else {
return ResponseEntity.status(HttpStatus.TOO_MANY_REQUESTS).build();
}
}
}
在这种情况下,我们限制为每分钟 120 个请求,存储桶容量为 120,再填充率为每分钟 120 个令牌。
如果超出此限制,我们将收到 HTTP 429 代码 (TOO_MANY_REQUESTS)。
【讨论】: