安全地读取Java中的文件

时间:2019-11-01 09:53:08

标签: java java-security

我正在使用IBM AppScan扫描代码,并且用一种方法传递UploadedFile类型的用户上传的文件,并使用以下代码将其读取到字节数组中。但是扫描给出了“漏洞类型-Validation.Required”错误。在运行这段代码之前,我正在验证文件扩展名并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 个答案:

答案 0 :(得分:2)

您对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());
    }

答案 1 :(得分:0)

不要使用FileInputStream或FileOutputStream。它们被认为是有害的。在某些情况下,乳清会导致您在生产中不希望出现的GC问题。

请参见this的说明。 SonarQube通常也显示此问题。

您应该使用:

Files.newInputStream(..)
Files.newOutputStream(..) 
相关问题