Fortify указал на проблему: «Ошибка переносимости: разделитель файлов», но в коде нет жестко разделенного разделителя - PullRequest
0 голосов
/ 12 июня 2019

Утилита Fortify SCA находит проблему, называемую Portability Flaw: File Separator, но с источником этих проблем нет жестко закодированного разделителя файлов, такого как "/" или "\", только расширения файла, такие как "." существует.

Наш клиент использовал Fortify SCA для сканирования устаревших исходных кодов системы. Уязвимость найденного дефекта переносимости: проблемы с разделителем файлов В нем говорится, что имена файлов, объявленные в массиве String, содержат жестко закодированный разделитель файлов (этот массив строк является источником проблемы), но я не вижу в этих разделителях файлов, таких как "/" или "\". строки имени файла.

    public static final String SYS_SPRAT = File.separator; //this is declared as a class attribute

    String[] fileNames = { //fortify points out here is the source of this issue
            "", 
            "2.5.1aaaaa.pdf", 
            "2.5.2bbbbb.pdf", 
            "2.5.3ccccc.pdf", 
                            .......
            "5.1.4甲甲甲甲甲.pdf", 
    };

    String fileName = null;
    File file = null;

    int iParam = Integer.parseInt(sParam);

    if (iParam >= 1 && iParam <= 26) {
        fileName = fileNames[iParam];
        String filePath = SYS_SPRAT + "home" + SYS_SPRAT + "xxx" + SYS_SPRAT + "ooo" + SYS_SPRAT + "Resource" + SYS_SPRAT + fileName;
        file = new File(filePath);  
    else {
        addFacesMessage("wrong parameter");
        return null;
    }

Я до сих пор не могу понять, почему существует проблема. Это ложный положительный результат? (но почему?)

1 Ответ

0 голосов
/ 27 июня 2019

Кажется, что Fortify может быть слишком строгим здесь. Даже их сайт говорит, что использование File.separator, как это должно быть в порядке.

Я не вижу проблем с переносимостью при использовании File.separator. Даже в системах OpenVMS, где пути к файлам имеют формат devicename:[directory.subdirectory]file.ext;version, среда выполнения Java внутренне переводит между разделителем / и правильным форматом VMS.

Во-первых, дважды проверьте с помощью инструмента «Поиск», что у вас нет символов \ или / ни в одной из строк в filenames[] (не полагайтесь только на визуальный контроль). Если такого персонажа точно нет, перейдите к предложению ниже.

Старайтесь вообще избегать File.separator. Вместо этого попробуйте использовать Paths.get :

public static final Path RESOURCE_DIR = Paths.get(
        "home", "xxx", "ooo", "Resource");

String[] fileNames = { 
        "", 
        "2.5.1aaaaa.pdf", 
        "2.5.2bbbbb.pdf", 
        "2.5.3ccccc.pdf", 
                        .......
        "5.1.4甲甲甲甲甲.pdf", 
};

String fileName = null;
File file = null;

int iParam = Integer.parseInt(sParam);

if (iParam >= 1 && iParam <= 26) {
    fileName = fileNames[iParam];
    file = RESOURCE_DIR.resolve(filePath).toFile();  
else {
    addFacesMessage("wrong parameter");
    return null;
}

Хорошо, когда ты это делаешь?

...