2011-06-18 223 views
3

我有使用BufferedReader readLine()從套接字讀取數據的情況,但readline()讀取數據,直到它在Data中找到新的行字符/返回托架。
如果我的數據不包含新行字符,那麼它將繼續讀取數據,直到找到新行並且入侵者可以注入DOS攻擊。 甚至套接字可以超時。如何防止對Java的BufferedReader readLine()方法的Dos攻擊?

我知道一種解決方案可能是我們需要限制行大小並只讀取一些數據,並將數據追加到緩衝區。

是最佳解決方案還是我可以用其他方式做到這一點?

我可以重寫BufferedReader並重寫readLine()方法。這是可行的解決方案嗎?

+0

另請參見[是否有可能使用超時讀取Java InputStream?](http://stackoverflow.com/questions/804951/is-it-possible-to-read-from-a-java-inputstream -with-a-timeout) –

+0

Subhas的一個很好的答案 - [https://stackoverflow.com/a/17142341/748087](https://stackoverflow.com/a/17142341/748087) – mod

回答

0

使用Socket.setSoTimeout(int)

javadoc

Qutoing啓用帶有指定超時/禁用SO_TIMEOUT,以毫秒爲單位。如果將此選項設置爲非零超時,則與此Socket關聯的InputStream上的read()調用將僅阻塞這段時間。

如果超時過期,將引發java.net.SocketTimeoutException,儘管Socket仍然有效。該選項必須在進入阻止操作生效之前啓用。超時值必須大於0.超時值爲零將被解釋爲無限超時。

還要注意的是,從該行

的選項必須在進入阻塞操作有效果啓用。

您必須在執行read操作之前致電Socket.setSoTimeout(int)