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;
}
我仍然不知道为什么有问题。这是假阳性吗? (但是为什么?)
答案 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可以吗?