В настоящее время у меня есть код для чтения 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
(случаи, когда файл, содержащий данные, превышающие доступную память)
Ниже приведены решения, о которых я мог подумать:
-
Создайте альтернативную реализацию метода
readLine
(readLine(int limit)
), который проверяет отсутствие. прочитанных байтов, и если он превышает указанный предел, создайте настраиваемое исключение. -
Обработайте файл по строкам, не загружая файл целиком. (чистое не-Java-решение :))
Пожалуйста, предложите, есть ли существующие библиотеки, которые реализуют вышеупомянутые решения. Также предлагайте альтернативные решения, которые предлагают более надежную или более удобную реализацию, чем предлагаемые. Хотя производительность также является основным требованием, безопасность на первом месте.