2

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

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

可能的解决方案:

  1. java.io.BufferedReader.read()逐字节使用,对它们进行计数并在达到限制后关闭连接。问题是攻击者可能每 29 秒传输一个字节,因此读取/连接超时几乎不会发生(204800B * 29sec = 68 天)
  2. 将线程执行限制为 1-5 分钟并使用java.io.BufferedReader.readLine(). 这里有什么问题吗?

我想重新发明轮子,解决方案非常简单,只是没有想到。

提前致谢。

4

2 回答 2

2

您可以通过自己编写一个 FilterInputStream 来封装 bhhis,它强制执行您想要强制执行的任何内容,并将其放置在堆栈底部,围绕连接输出流

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

于 2010-09-02T10:38:34.933 回答
0

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

一个巨大的大行吞噬内存。MeteredInputStream可能最简单的方法是在字符解码之前使用 a 。char在任何情况下阅读char都会非常缓慢。您可以一次阅读很长时间char[],但这可能会使代码过于复杂。

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

于 2010-09-02T09:59:32.973 回答