Цель: Пакетному приложению необходимо прочитать файл с сервера. Точный каталог может измениться в будущем, и поэтому мы должны сделать его динамическим.
Подход принят: Путь к файлу (каталоги) и имя файла будут предоставлены в файле yaml приложения следующим образом:
путь к файлу: / application / directory
имя файла: test.csv
Код длято же самое: Начальная версия:
File file = new File(filePath,filename);
SonarQube показала уязвимость, предложив следующее: Файл открывается для чтения его содержимого. Имя файла происходит от входного параметра. Если в этот файловый API передается нефильтрованный параметр, файлы из произвольного расположения файловой системы могут быть прочитаны. Это правило определяет потенциальные уязвимости обхода пути. Во многих случаях созданный путь к файлу не может контролироваться пользователем. В этом случае сообщаемый экземпляр является ложноположительным.
Уязвимый код:
@GET
@Path("/images/{image}")
@Produces("images/*")
public Response getImage(@javax.ws.rs.PathParam("image") String image) {
File file = new File("resources/images/", image); //Weak point
if (!file.exists()) {
return Response.status(Status.NOT_FOUND).build();
}
return Response.ok().entity(new FileInputStream(file)).build();
}
Решение:
import org.apache.commons.io.FilenameUtils;
@GET
@Path("/images/{image}")
@Produces("images/*")
public Response getImage(@javax.ws.rs.PathParam("image") String image) {
File file = new File("resources/images/", FilenameUtils.getName(image)); //Fix
if (!file.exists()) {
return Response.status(Status.NOT_FOUND).build();
}
return Response.ok().entity(new FileInputStream(file)).build();
}
Я изменил свой код соответственно:
File file = new File(filePath,FilenameUtils.getName(fileName));
Тем не менее я получаю то же сообщение об ошибке. Любая помощь здесь высоко ценится.