首页 > 解决方案 > 如何使用 Jax-RS 防止 DDoS 攻击?

问题描述

我已经实现了这个简单的类来处理 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);

标签: javajax-rswildfly

解决方案


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

有像mod_ratelimit这样的服务器上解决方案,对于 IP 阻止列表,这个答案是在 O/S 级别完成的。但是在集群环境中,您现在必须在所有机器上维护它。

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


推荐阅读