Fortify SCA 工具发现一个名为可移植性缺陷:文件分隔符的问题,但对于这些问题的根源,没有硬编码的文件分隔符,如"/"或"\",只有文件扩展名如"."存在。
我们的客户使用 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;
}
我仍然无法弄清楚为什么会有问题。是误报吗?(但为什么?
看来Fortify在这里可能过于严格了。甚至他们的网站也说使用这样的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;
}
当你这样做时,强化可以吗?