【发布时间】:2015-12-28 17:22:43
【问题描述】:
我遇到了一个 Web 服务问题,用户试图通过循环随机 ID 来猜测应用程序 ID。
错误请求来自随机 IP,所以我不能只禁止他们的 IP(除非我动态地这样做,但我还没有调查)。
目前,当我检测到一个客户端尝试了 10 次错误的应用 ID 尝试时,我会将它们放在我的应用中的阻止列表中,并在当天拒绝来自该 IP 的进一步请求。
我想尽量减少我的服务器需要做的工作量,因为坏客户端即使被拒绝也会继续发送 1000 多个请求。我知道有动态防火墙解决方案,但现在想在我的应用程序中轻松实现。目前我正在睡觉 5 秒以减少呼叫,但我想做的只是不向客户端发送响应,所以它必须超时。
有人知道如何在 Java 中,在 JAX-RS 中做到这一点吗?
我的服务是这样的,
@Path("/api")
public class MyServer {
@GET
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
@Path("/my-request")
public String myRequest(String type,
@Context HttpServletRequest requestContext,
@Context HttpServletResponse response) {
...
}
【问题讨论】:
-
攻击者可能不在乎请求是否超时。听起来它来自机器人农场,这意味着永远打开连接是无关紧要的。我不了解 JAX RS,但在 Java 中,我会查看异步 servlet(或延续)以不占用休眠 5 秒的服务器线程。抱歉,我不知道如何在 JAXRS 中做到这一点!
-
添加睡眠会减少调用,所以让它超时应该会进一步减少调用,我认为它来自 Androd 应用程序,而不是农场
-
嘿@James,您是否尝试过将客户端重定向到非常慢的地方或其他地方的大文件?如果客户端接受重定向,它将被占用一段时间,您不再需要休眠线程。
-
@konqi 我认为攻击者很快就会提出一个解决方案来避免跟随重定向:) 此外,攻击者没有注意到他在被阻止时会等待 5 秒,但是当他这样做时,他肯定会停止等待响应,即他将尝试发出并行请求。所以,James,你的解决方案可能不会有很长时间,除非请求确实来自移动设备,在这种情况下,你可以希望移动设备的所有者会注意到最终的大流量并卸载应用程序。
-
你能改变/修改你的 REST API 吗?
标签: java web-services rest jax-rs ddos