Уязвимость SonarQube при использовании класса File в Java - PullRequest
0 голосов
/ 20 октября 2019

Цель: Пакетному приложению необходимо прочитать файл с сервера. Точный каталог может измениться в будущем, и поэтому мы должны сделать его динамическим.

Подход принят: Путь к файлу (каталоги) и имя файла будут предоставлены в файле 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));

Тем не менее я получаю то же сообщение об ошибке. Любая помощь здесь высоко ценится.

1 Ответ

0 голосов
/ 22 октября 2019

Да, это ложное срабатывание.

Я удалил это, используя // NOSONAR в конце оператора

File file = new File("resources/images/", FilenameUtils.getName(image));  //NOSONAR
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...