【发布时间】: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);
【问题讨论】: