2011-06-18 218 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)