解决Veracode的CWE-73:“外部控制文件名或路径”
我在我的应用程序中有一个函数,用于将生成的pdf文件流输出到磁盘文件,但我从Veracode的扫描中得到了一个缺陷[CWE-73],这会导致安全漏洞,攻击者可以访问文件系统上的任何文件,并读取文件甚至覆盖预期文件以外的文件。
try(FileOutputStream fos = new FileOutputStream(fileName)) {
// write stream to fos
}catch (Exception e) {
e.printStackTrace();
}
为解决此问题,参考verocode官网,使用了白名单(输入范围有限)以确保只提交众所周知的值。
https://www.veracode.com/security/java/cwe-73
但是问题仍然出现,公司Veracode网站有推荐使用ESAPI进行validate,但是我拒绝为此引入一个第三方组件。
然后使用下面java函数对文件名进行清洗(仅针对文件名,不包括文件后缀和路径),这在veracode中不再扫出安全漏洞。
public static String sanitizeFileName(String name) {
return name
.chars().mapToObj(i -> (char) i)
.map(c -> Character.isWhitespace(c) ? '_' : c)
.filter(c -> Character.isLetterOrDigit(c) || c == '-' || c == '_' || c == ':')
.map(String::valueOf)
.collect(Collectors.joining());
}