我正在使用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());
}
答案 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(..)