我正在编写一个工具,给定任何URL,它会定期获取其输出。问题是输出可能不是一个简单而轻量级的HTML页面(在大多数情况下是预期的),而是一些繁重的数据流(即直接来自/ dev / urandom,可能的DoS攻击)。
我正在使用java.net.URL
+ java.net.URLConnection
,将连接和读取超时设置为30秒。目前正由java.io.BufferedReader
使用readLine()
读取输入。
可能的解决方案:
java.io.BufferedReader.read()
,计算它们并在达到限制后关闭连接。问题是攻击者可能每29秒传输一个字节,因此几乎不会发生读取/连接超时(204800B * 29秒= 68天)java.io.BufferedReader.readLine()
。这里有什么问题吗?我想尝试重新发明轮子,解决方案非常简单,我想不到。
提前致谢。
答案 0 :(得分:1)
你可以通过编写一个FilterInputStream来封装它,这个FilterInputStream强制执行你想强制执行的任何操作,并将它放在堆栈的底部,围绕连接输出流
但是,如果输出以分块传输模式到达,则此建议和补救措施仅适用。否则,HttpURLConnection可以在读取任何响应之前缓冲整个响应。通常的解决方案是防火墙中的过滤器。
答案 1 :(得分:0)
这里似乎有很多拒绝服务的途径。
吞噬记忆的巨大线条。可能最简单的方法是在进行字符解码之前使用MeteredInputStream
。在char
下阅读char
在任何情况下都会非常缓慢。您可以一次阅读很长的char[]
,但这可能会使代码复杂化。
处理对手(或bug),同时保持许多连接存活。您可能希望非阻塞I / O读取整个消息,然后正常进行。