Façon la plus robuste de lire un fichier ou un flux en utilisant Java (Pour éviter les attaques DoS)

Actuellement, j'ai le code ci-dessous pour la lecture d'un inputStream. Je suis le stockage de l'intégralité du fichier en un StringBuilder variable et le traitement de cette chaîne par la suite.

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();

}

Le code est allé pour un examen avec l'équipe de Sécurité et les commentaires suivants ont été reçus:

  1. BufferedReader.readLine est sensible à DOS (Déni de Service) attaques (ligne de longueur infinie, énorme fichier contenant pas de saut de ligne/carriage retrun)

  2. Épuisement de ressources pour la classe StringBuilder variable (cas lorsqu'un fichier contenant des données plus grande que la mémoire disponible)

Ci-dessous sont les solutions que je pouvais penser:

  1. Créer une variante de mise en œuvre de la méthode readLine (readLine(int limit)), qui vérifie le pas. d'octets lus et si elle dépasse la limite spécifiée, lever une exception personnalisée.

  2. Traiter le fichier ligne par ligne, sans charger le fichier en entier. (pur non-java solution 🙂 )

Veuillez indiquer s'il existe des bibliothèques qui mettent en œuvre ci-dessus solutiuons.
Aussi suggérer des solutions de rechange qui offrent plus de robustesse et sont plus faciles à mettre en œuvre que le projet de ceux de. Si la performance est également un impératif majeur, la sécurité vient en premier.

Merci d'Avance.

source d'informationauteur Unni Kris