Java输入流限制:防止DoS攻击
我正在编写一个工具,在给定任何URL的情况下,它会定期获取其输出。问题在于,输出可能不是简单、轻量级的HTML页面(大多数情况下都是这样),而是一些繁重的数据流(即直接来自/dev/uradom,可能是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()逐字
java.net.URL
+java.net.URLConnection
,将连接和读取超时设置为30秒。当前,java.io.BufferedReader
正在使用readLine()
读取输入
可能的解决办法:
java.io.BufferedReader.read()
逐字节计数,并在达到限制后关闭连接。问题在于,攻击者可能每29秒传输一个字节,因此几乎不会发生读取/连接超时(204800B*29秒=68天)java.io.BufferedReader.readLine()
。这里有什么问题吗提前感谢。这里似乎有很多拒绝服务的途径 一条吞噬记忆的大线条。可能最简单的方法是在执行字符解码之前使用
MeteredInputStream
。通过char
读取char
在任何情况下都会非常慢。您可以一次读取一个长的char[]
,但这可能会使代码过于复杂
与对手(或bug)打交道时,可以同时保持多个连接。您可能希望非阻塞I/O读取整个消息,然后正常进行。您可以通过编写一个FilterInputStream来封装BHHIS,该FilterInputStream强制执行您想要强制执行的内容,并将其放置在堆栈底部连接输出流周围
然而,只有当输出以分块传输模式到达时,这和您建议的补救措施才有效。否则,HttpURLConnection可以在读取任何响应之前缓冲整个响应。通常的解决方案是在防火墙中安装一个过滤器 使用重写的read()方法编写LimitedInputStream扩展FilterInputStream,当达到限制时返回-1(假输入流结束)。谢谢