2010-09-02 38 views
2

我正在編寫一個工具,即在任何URL的情況下,它都會定期獲取其輸出。問題在於輸出可能不是一個簡單輕量級的HTML頁面(大多數情況下預期),而是一些沉重的數據流(即直接來自/ dev/urandom,可能的DoS攻擊)。Java輸入流限制:防範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()。這裏有什麼問題?

我覺得想重新發明輪子,解決方案非常簡單,只是不會出現在我的腦海。

在此先感謝。

回答

1

您可以通過自己編寫一個FilterInputStream是強制要執行什麼,並把它在堆棧的底部,連接輸出流

但是圍繞這和補救措施encapsulatebhhis你建議僅在輸出工作正在進入分塊傳輸模式。否則,HttpURLConnection可以在讀取任何消息之前緩衝整個響應。通常的解決方案是防火牆中的過濾器。

+0

寫入LimitedInputStream使用overriden read()方法擴展FilterInputStream,當達到限制時返回-1(假輸入流結束)。謝謝! – ljank 2010-09-03 07:07:24

0

這裏似乎有很多拒絕服務的途徑。

吞噬記憶的巨大線條。在打字符解碼之前,最簡單的方法是使用MeteredInputStream。在任何情況下閱讀charchar將是非常緩慢。您可以一次讀取長長的char[],但這可能會使代碼複雜化。

處理一個對手(或錯誤),保持許多連接同時存在。您可能希望非阻塞I/O讀取整個消息,然後正常進行。