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

Java输入流限制:防止DoS攻击,java,inputstream,ddos,Java,Inputstream,Ddos,我正在编写一个工具,在给定任何URL的情况下,它会定期获取其输出。问题在于,输出可能不是简单、轻量级的HTML页面(大多数情况下都是这样),而是一些繁重的数据流(即直接来自/dev/uradom,可能是DoS攻击) 我正在使用java.net.URL+java.net.URLConnection,将连接和读取超时设置为30秒。当前,java.io.BufferedReader正在使用readLine()读取输入 可能的解决办法: 使用java.io.BufferedReader.read()逐字

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

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

可能的解决办法:

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


    提前感谢。

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

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


    与对手(或bug)打交道时,可以同时保持多个连接。您可能希望非阻塞I/O读取整个消息,然后正常进行。

    您可以通过编写一个FilterInputStream来封装BHHIS,该FilterInputStream强制执行您想要强制执行的内容,并将其放置在堆栈底部连接输出流周围


    然而,只有当输出以分块传输模式到达时,这和您建议的补救措施才有效。否则,HttpURLConnection可以在读取任何响应之前缓冲整个响应。通常的解决方案是在防火墙中安装一个过滤器

    使用重写的read()方法编写LimitedInputStream扩展FilterInputStream,当达到限制时返回-1(假输入流结束)。谢谢