【问题标题】:Java input stream limit: protecting against DoS attacksJava 输入流限制:防止 DoS 攻击
【发布时间】:2010-09-02 09:17:22
【问题描述】:

我正在编写一个工具,给定任何 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()。这里有什么问题吗?

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

提前致谢。

【问题讨论】:

    标签: java inputstream ddos


    【解决方案1】:

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

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

    【讨论】:

    • 使用重写的 read() 方法编写了 LimitedInputStream 扩展 FilterInputStream,当达到限制时返回 -1(假输入流结束)。谢谢!
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 2023-04-07
      • 1970-01-01
      • 2011-10-27
      • 2011-10-22
      相关资源
      最近更新 更多