我有一种情况,我使用BufferedReader readLine()
从套接字读取数据,但readline()
读取数据,直到它在数据中找到新的行字符/返回运输。
如果我的数据不包含新行字符,那么它将继续读取数据,直到找到新行并且入侵者可以注入DOS攻击。甚至socket也可以超时。
我知道一个解决方案可能是我们需要限制行大小并只读取一些数据,并将数据附加到缓冲区。
它是最佳解决方案还是我可以通过其他方式实现?
我可以覆盖BufferedReader并覆盖readLine()方法。这是可行的解决方案吗?
使用Socket.setSoTimeout(int)
引自qazxsw poi
使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。如果将此选项设置为非零超时,则与此Socket关联的InputStream上的read()调用将仅阻止这段时间。
如果超时到期,则引发java.net.SocketTimeoutException,尽管Socket仍然有效。必须在进入阻止操作之前启用该选项才能生效。超时必须> 0.超时为零被解释为无限超时。
另请注意,从这一行
必须在进入阻止操作之前启用该选项才能生效。
你必须在做javadoc操作之前调用Socket.setSoTimeout(int)
。