Безопасно читать файл в Java - PullRequest
2 голосов
/ 01 ноября 2019

Я сканирую свой код с помощью IBM AppScan, и одним способом я передаю файл, загруженный пользователем типа UploadedFile, и считываю его в байтовый массив, используя приведенный ниже код. Но сканирование выдает ошибку «Тип уязвимости - Проверка. Требуется». Я проверяю расширение файла и null проверяю файл, прежде чем запустить этот фрагмент кода.

Проверка проверки:

if (file != null && !file.getFileName().isEmpty()) {
     // Checking file extension here. Like jpg,png etc.
}

Он попадает в категорию CWE 20 если это поможет. https://cwe.mitre.org/data/definitions/20.html

private int fileUpload(UploadedFile file) { // import org.primefaces.model.UploadedFile;
        try {
            String fileName = file.getFileName();
            int fileSize = (int) file.getSize();
            String fileType = new Validator().fetchFileExtension(fileName);
            byte[] filebytea = new byte[fileSize];
            try {
                FileInputStream fileStream = (FileInputStream) file.getInputstream();
                fileStream.read(filebytea); // Error: Vulnerability Type Validation.Required
            } catch (Exception e) {
                //System.out.println("error in file stream" + e.getMessage());
            }

Ответы [ 2 ]

2 голосов
/ 01 ноября 2019

Ваш звонок на read является проблемой. Может, но не обязательно, чтобы прочитать данные полностью. Следовательно, вы должны проверить возвращаемое значение read и вызвать его несколько раз. Если вы не хотите реализовывать это самостоятельно, вы можете использовать DataInputStream.readFully() или fileStream.readAllBytes() (последний требует Java 9 +).

Следующий код не должен вызывать никаких проблем и работает на Java 7+:

    try (DataInputStream in = new DataInputStream(file.getInputstream())) {
        in.readFully(filebytea); 
    } catch (Exception e) {
        //System.out.println("error in file stream" + e.getMessage());
    }
0 голосов
/ 01 ноября 2019

Не используйте FileInputStream или FileOutputStream. Они считаются вредными. В некоторых случаях они могут привести к проблемам с ГХ, которые вам не нужны в производстве.

См. это объяснение. SonarQube обычно также показывает эту проблему.

Вместо этого вы должны использовать:

Files.newInputStream(..)
Files.newOutputStream(..) 
...