Fortify指出了一个问题:“可移植性缺陷:文件分隔符”,但是代码中没有硬编码的分隔符

时间:2019-06-12 04:36:01

标签: java fortify

Fortify SCA工具发现了一个名为“可移植性缺陷:文件分隔符”的问题,但是由于这些问题的根源,没有硬编码的文件分隔符(例如“ /”或“ \”),只有文件扩展名(例如)。存在。

我们的客户使用Fortify SCA来扫描其旧系统源代码。 Fortify发现可移植性缺陷:文件分隔符问题。它说在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 :(得分:0)

Fortify在这里似乎过于严格。甚至their website都说可以这样使用File.separator

使用File.separator看不到任何可移植性问题。即使在文件路径为devicename:[directory.subdirectory]file.ext;version格式的OpenVMS系统上,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;
}

执行此操作后Fortify可以吗?