java - 如何使用 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);
解决方案
你仍然很容易被 DDOS 攻击。我可以每秒数千次从阻止列表 IP 10 进入您的服务器,现在我已经对您的 Wildfly 和可能的数据库进行了 DDOS 攻击。
有像mod_ratelimit这样的服务器上解决方案,对于 IP 阻止列表,这个答案是在 O/S 级别完成的。但是在集群环境中,您现在必须在所有机器上维护它。
我会说,如果您托管在具有真实生产服务器的真实环境中,则需要 AWS WAF之类的东西或其他环境中的等效物。不要重新发明轮子——有更好的方法不需要你维护它。
推荐阅读
- r - 在 R 包内的窗口上使用 doParallel 和 Rcpp 函数
- javascript - 如果选择的下拉列表中的特定值显示不同的下拉列表
- json - 解析/提取 CSV 文件中的 JSON 数据
- node.js - 如何使用 Sequelize belongsTo
- flutter - Flutter:Streambuilder被多次调用
- sql-server - 有没有按月和lineNum 重叠的求和函数?
- elasticsearch - 用于弹性搜索的 kubernetes statefulset-controller 特权初始化容器
- powerbi - 使用查询添加列时关系中断
- python-requests - 这是python36版本的问题吗?如何解决?
- bit-manipulation - Count leading zero bits for each element in AVX2 vector, emulate _mm256_lzcnt_epi32