Java输入流限制:防止DoS攻击

时间:2010-09-02 09:17:23

标签: java inputstream ddos

我正在编写一个工具,给定任何URL,它会定期获取其输出。问题是输出可能不是一个简单而轻量级的HTML页面(在大多数情况下是预期的),而是一些繁重的数据流(即直接来自/ dev / urandom,可能的DoS攻击)。

我正在使用java.net.URL + java.net.URLConnection,将连接和读取超时设置为30秒。目前正由java.io.BufferedReader使用readLine()读取输入。

可能的解决方案:

  1. 逐字节使用java.io.BufferedReader.read(),计算它们并在达到限制后关闭连接。问题是攻击者可能每29秒传输一个字节,因此几乎不会发生读取/连接超时(204800B * 29秒= 68天)
  2. 将线程执行限制为1-5分钟并使用java.io.BufferedReader.readLine()。这里有什么问题吗?
  3. 我想尝试重新发明轮子,解决方案非常简单,我想不到。

    提前致谢。

2 个答案:

答案 0 :(得分:1)

你可以通过编写一个FilterInputStream来封装它,这个FilterInputStream强制执行你想强制执行的任何操作,并将它放在堆栈的底部,围绕连接输出流

但是,如果输出以分块传输模式到达,则此建议和补救措施仅适用。否则,HttpURLConnection可以在读取任何响应之前缓冲整个响应。通常的解决方案是防火墙中的过滤器。

答案 1 :(得分:0)

这里似乎有很多拒绝服务的途径。

吞噬记忆的巨大线条。可能最简单的方法是在进行字符解码之前使用MeteredInputStream。在char下阅读char在任何情况下都会非常缓慢。您可以一次阅读很长的char[],但这可能会使代码复杂化。

处理对手(或bug),同时保持许多连接存活。您可能希望非阻塞I / O读取整个消息,然后正常进行。