有没有一种简单有效的方法来延迟来自Javaservlet的响应

有没有一种简单有效的方法来延迟来自Javaservlet的响应,java,security,servlets,denial-of-service,Java,Security,Servlets,Denial Of Service,当我有明显的黑客企图时,我能做什么?我希望有一个简单的方法让他们浪费时间,这不涉及服务器资源。即使是几秒钟的延迟也可能导致暴力攻击无效 将它们发送到AsyncContext似乎过于占用处理器资源,超时将自动将同一请求重新发送回其开始位置。这可能会帮助DOS攻击 我正在使用Jetty并了解DoSFilter,但如果我能在检测到犯规时延迟响应,效果会更好,这在我的情况下很容易感觉到。我认为每一次失败的验证/身份验证尝试都会以某种方式自动延迟响应 我在这里不是真正的身份验证,因此身份验证协议/前端没有

当我有明显的黑客企图时,我能做什么?我希望有一个简单的方法让他们浪费时间,这不涉及服务器资源。即使是几秒钟的延迟也可能导致暴力攻击无效

将它们发送到AsyncContext似乎过于占用处理器资源,超时将自动将同一请求重新发送回其开始位置。这可能会帮助DOS攻击

我正在使用Jetty并了解DoSFilter,但如果我能在检测到犯规时延迟响应,效果会更好,这在我的情况下很容易感觉到。我认为每一次失败的验证/身份验证尝试都会以某种方式自动延迟响应


我在这里不是真正的身份验证,因此身份验证协议/前端没有用处。我只是验证满足某些条件的模式的连接参数。我知道TCP/IP会发出通知,但如果我能无声地断开无效的访问尝试并使其挂起,那将是理想的。

如果您收到来自同一IP的可疑重复请求,您可以引入逐步升级的延迟:

Thread.sleep(n);

其中,n会使每个后续事件加倍。

如果您从同一IP收到可疑的重复请求,您可以引入逐步升级的延迟:

Thread.sleep(n);

其中,n会使随后的每个事件加倍。

我认为,如果你检测到一个愚蠢的游戏,在一段时间内屏蔽他们的ip会更明智。只需将ip添加到
/etc/hosts.deny中就很容易了(它适用于许多unix守护进程,但我不确定它是否也适用于java进程,我认为它应该可以工作,因为tcp守护进程本身使用它)
man5主机。命令行中的deny
给出一些提示(或检查)


顺便说一句,我认为您可以使用暂停servlet,就像在任何普通java代码中一样。但这可能会导致来自同一调用方的更多请求长时间保持打开状态,从而增加应用程序服务器必须分配和维护的活动资源。因此,如果攻击者可以在多线程中工作,这可能会帮助他阻止您的服务器,因为它将为他的攻击保留所有线程,阻止所有其他用户访问您的服务。

我认为,如果您检测到一个愚蠢的游戏,在一定时间内阻止他们的ip会更明智。只需将ip添加到
/etc/hosts.deny中就很容易了(它适用于许多unix守护进程,但我不确定它是否也适用于java进程,我认为它应该可以工作,因为tcp守护进程本身使用它)
man5主机。命令行中的deny
给出一些提示(或检查)


顺便说一句,我认为您可以使用暂停servlet,就像在任何普通java代码中一样。但这可能会导致来自同一调用方的更多请求长时间保持打开状态,从而增加应用程序服务器必须分配和维护的活动资源。因此,如果攻击者可以在多线程中工作,这可能会帮助他阻止您的服务器,因为它将为他的攻击保留所有线程,阻止所有其他用户访问您的服务。

我实际上认为异步上下文可能是比在同步请求上休眠更好的解决方案


但是,我认为您必须尝试这两种方案,并实际测量每种方案对cpu使用率和总吞吐量的影响,以确保这一点。

我实际上认为异步上下文可能是比在同步请求上休眠更好的解决方案


但是,我认为您必须尝试这两种方案,并实际测量每种方案对cpu使用率和总吞吐量的影响,以确保安全。

您应该在较低的级别进行保护。Java的任何参与都会比黑客对您造成更大的伤害,因为容器会根据每个请求创建环境

最有可能的是,黑客不会等待响应,所以你不会延迟响应来攻击他们


使用
nginx
或防火墙级别。

您应该在较低级别进行保护。Java的任何参与都会比黑客对您造成更大的伤害,因为容器会根据每个请求创建环境

最有可能的是,黑客不会等待响应,所以你不会延迟响应来攻击他们


使用
nginx
或防火墙级别。

我想知道这一点,但它不占用线程吗?我认为HTTPServlet是从由有限数量的线程组成的线程池中提供的。因此,如果它确实占用了一个线程,那么多线程攻击是否会耗尽池并关闭servlet?如果它不绑线,那就太容易了,我甚至会因为问这个问题而感到尴尬!绝对不要在服务器线程中睡眠。您是对的,它将阻塞线程,最终耗尽池并导致成功的DOS攻击。@MarkoTopolnik完全不同意。这取决于你想阻止什么。如果它的密码被破解,那么这将起作用。对于DOS攻击,最好是在到达servlet之前切换硬件忽略请求洪水。将
Thread.sleep
方法与
AsyncContext
进行比较,你会发现
Thread.sleep
不可能有任何优势。我想知道,但它不是绑着一根线吗?我认为HTTPServlet是从由有限数量的线程组成的线程池中提供的。因此,如果它确实占用了一个线程,那么多线程攻击是否会耗尽池并关闭servlet?如果它不绑线,那就太容易了,我甚至会因为问这个问题而感到尴尬!绝对不要在服务器线程中睡眠。您是对的,它将阻塞线程,最终耗尽池并导致成功的DOS攻击。@MarkoTopolnik完全不同意。这取决于你想阻止什么。如果它的密码被破解,那么这将起作用。对于DOS攻击,最好通过切换硬件来处理