使用 Java 读取文件或流的最可靠方式(防止 DoS 攻击)
目前我有下面的代码来阅读.我将整个文件存储到一个变量中,然后处理此字符串。InputStream
StringBuilder
public static String getContentFromInputStream(InputStream inputStream)
// public static String getContentFromInputStream(InputStream inputStream,
// int maxLineSize, int maxFileSize)
{
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String lineSeparator = System.getProperty("line.separator");
String fileLine;
boolean firstLine = true;
try {
// Expect some function which checks for line size limit.
// eg: reading character by character to an char array and checking for
// linesize in a loop until line feed is encountered.
// if max line size limit is passed then throw an exception
// if a line feed is encountered append the char array to a StringBuilder
// after appending check the size of the StringBuilder
// if file size exceeds the max file limit then throw an exception
fileLine = bufferedReader.readLine();
while (fileLine != null) {
if (!firstLine) stringBuilder.append(lineSeparator);
stringBuilder.append(fileLine);
fileLine = bufferedReader.readLine();
firstLine = false;
}
} catch (IOException e) {
//TODO : throw or handle the exception
}
//TODO : close the stream
return stringBuilder.toString();
}
该代码已与安全团队进行了审查,并收到了以下评论:
BufferedReader.readLine
容易受到 DOS(拒绝服务)攻击(无限长的行,不包含换行/回车符的大文件)变量的资源耗尽(当文件包含的数据大于可用内存时)
StringBuilder
以下是我能想到的解决方案:
创建方法 () 的替代实现,用于检查 no。读取的字节数,如果超过指定的限制,则引发自定义异常。
readLine
readLine(int limit)
逐行处理文件,而不完整加载文件。(纯非Java解决方案:))
请建议是否有任何现有的库实现上述解决方案。还要建议任何比建议的更健壮或更方便实现的替代解决方案。虽然性能也是一项主要要求,但安全性是第一位的。