如何防止Java中BufferedReader readLine()方法的Dos攻击?

问题描述 投票:3回答:1

我有一种情况,我使用BufferedReader readLine()从套接字读取数据,但readline()读取数据,直到它在数据中找到新的行字符/返回运输。 如果我的数据不包含新行字符,那么它将继续读取数据,直到找到新行并且入侵者可以注入DOS攻击。甚至socket也可以超时。

我知道一个解决方案可能是我们需要限制行大小并只读取一些数据,并将数据附加到缓冲区。

它是最佳解决方案还是我可以通过其他方式实现?

我可以覆盖BufferedReader并覆盖readLine()方法。这是可行的解决方案吗?

java bufferedreader denial-of-service
1个回答
0
投票

使用Socket.setSoTimeout(int)

引自qazxsw poi

使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。如果将此选项设置为非零超时,则与此Socket关联的InputStream上的read()调用将仅阻止这段时间。

如果超时到期,则引发java.net.SocketTimeoutException,尽管Socket仍然有效。必须在进入阻止操作之前启用该选项才能生效。超时必须> 0.超时为零被解释为无限超时。

另请注意,从这一行

必须在进入阻止操作之前启用该选项才能生效。

你必须在做javadoc操作之前调用Socket.setSoTimeout(int)

© www.soinside.com 2019 - 2024. All rights reserved.