【问题标题】:Restrict access to public service many times多次限制获得公共服务
【发布时间】:2017-01-30 18:50:35
【问题描述】:

我有这样的情况。假设有一个公共 REST 服务。我们不希望有人能够在短时间内多次访问此服务,因为他们将能够阻止我们的数据库(我想这本质上是 DDOS 攻击?)。

有没有办法有效地防范这种类型的攻击?我们使用的技术是 Spring/Spring Security。

【问题讨论】:

  • 您正在寻找request throttling。这最好在入侵检测系统(应该检测 DDoS 攻击)或 Internet 网关(如果您没有 IDS)上完成。如果做不到这一点,实施节流的最佳位置将是在 Web 服务器上。 ApacheIISNginx 都支持限流。

标签: java spring security spring-security ddos


【解决方案1】:

如果你使用 Spring Boot 有一个相当新的开源项目可以处理这个问题:

https://github.com/weddini/spring-boot-throttling

对 Spring 服务进行节流控制的声明式方法。 @Throttling 注解帮助你限制服务方法的数量 每个 java.util.concurrent.TimeUnit 对特定用户 IP 的调用 地址、HTTP 标头/cookie 值或使用 Spring 表达式语言 (SpEL)。

显然这不会阻止网络服务器级别的 DDOS 攻击,但它有助于限制对长时间运行的查询的访问或实施公平使用策略。

【讨论】:

  • 这个解决方案需要java 8+
【解决方案2】:

对于那些对该主题感兴趣的人,spring-boot-throttling 似乎不再维护。

所以,我看看bucket4j

使用很简单:主要有3个对象:

  • Bucket :允许定义可用令牌总容量的接口。它还提供了使用令牌的方法。
  • Bandwidth :允许定义存储桶限制的类。
  • Refill :类允许定义桶的方式,使用新的令牌。

简单的 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)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 2013-02-06
    • 2020-07-01
    相关资源
    最近更新 更多