【问题标题】:How to prevent DDoS attack with Jax-RS?如何使用 Jax-RS 防止 DDoS 攻击?
【发布时间】:2020-10-27 10:27:02
【问题描述】:

我已经实现了这个简单的类来处理 Jax-rs Rest-API 服务中可能的 DDoS 攻击。 你怎么看?

public static CheckerDDOS getInstance(StatusIPDao statusDao, HttpRequestDao httpRequestDao) {
    if (instance == null) {
        instance = new CheckerDDOS(statusDao, httpRequestDao);
        new CleanerHTTPRequest(httpRequestDao).setupClean();
    }
    return instance;
}

public void check(String ip, String uri, ContainerRequestContext container) {
    statusIP = statusDao.findByIp(ip);
    if (statusIP != null) {
        if (statusIP.isBlocked()) {
            blockedIP(container);
            return;
        }
        if (statusIP.getnOfRequestsLastMinute() >= LIMIT_REQUEST) {
            rateLimitExceeded(container);
            return;
        }
    } else {
        statusIP = new StatusIP();
        statusIP.setIp(ip);
    }
    new Thread(new Runnable() {

        @Override
        public void run() {
            HttpRequest httpRequest = new HttpRequest();
            httpRequest.setIp(ip);
            httpRequest.setUri(uri);
            httpRequest.setTimestamp(Calendar.getInstance());
            httpRequestDao.store(httpRequest);
            long nOfRequestsLastMinute = httpRequestDao.countByIp(ip);
            statusIP.setnOfRequestsLastMinute(nOfRequestsLastMinute);
            statusDao.store(statusIP);
        }
    }).start();
}

private void blockedIP(ContainerRequestContext container) {
    container.abortWith(Response.status(Status.UNAUTHORIZED).entity("Your IP address has been blocked!").build());
}

private void rateLimitExceeded(ContainerRequestContext container) {
    container.abortWith(Response.status(Status.TOO_MANY_REQUESTS)
            .entity("Too many requests, you're IP has been blocked!").build());
}

这在过滤器中被调用:

String ip = request.getRemoteAddr();
    String uri = info.getPath();
    CheckerDDOS checkerDDOS = CheckerDDOS.getInstance(statusDao, httpRequestDao);
    checkerDDOS.check(ip, uri, container);

【问题讨论】:

    标签: java jax-rs wildfly


    【解决方案1】:

    您仍然很容易被 DDOS 攻击。我可以每秒数千次从阻止列表 IP 10 进入你的服务器,现在我已经 DDOS 攻击了你的 Wildfly,可能还有你的数据库。

    有像 mod_ratelimit 这样的服务器上解决方案,对于 IP 阻止列表,this answer 在操作系统级别执行此操作。但在集群环境中,您现在必须在所有机器上维护它。

    我会说,如果您托管在具有真实生产服务器的真实环境中,则需要 AWS WAF 之类的东西或其他环境中的等效物。不要重新发明轮子 - 有更好的方法不需要您维护它。

    【讨论】:

      猜你喜欢
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 2016-05-11
      • 2017-03-31
      • 1970-01-01
      • 2021-06-26
      相关资源
      最近更新 更多