在Java中,这些是相同的:
new File (a.getPath() + filename);
new File (String.format(a.getPath() + filename));
我在findbugs中收到一些警告,第二个选项似乎解决了这个问题。
答案 0 :(得分:8)
两者都是IMO的不良选择。如果想要将目录名称与文件名组合,请使用专门为此设计的File
构造函数:
new File(a.getPath(), filename)
(我不明白为什么使用String.format
来修复警告,但由于我们不知道警告是什么,所以很难猜测。但是,这肯定会让它变得更脆弱,因为字符串将被解释为格式模式,可能不是。)
答案 1 :(得分:2)
String.format()
并且您添加了额外的参数,否则 format string不会执行任何操作,因此在这种情况下,您似乎只是隐藏警告。很可能FindBugs知道new File(a + b);
可能是一个错误,但无法判断new File(someFunction());
是否是一个错误。
根据the documentation for PT_RELATIVE_PATH_TRAVERSAL:
该软件使用HTTP请求参数来构造路径名 应该在受限制的目录中,但它不正确 中和可以解析到某个位置的序列,例如“..” 在该目录之外。看到 http://cwe.mitre.org/data/definitions/23.html了解更多信息。
FindBugs只关注最明显,最明显的亲戚案例 路径遍历。如果FindBugs发现任何东西,你几乎肯定会有更多 FindBugs不报告的漏洞。如果你担心 关于相对路径遍历,你应该认真考虑使用a 商业静态分析或笔测试工具。
因此,String.format()
技巧有效,因为FindBugs只能捕获明显的这种情况,但更大的问题似乎是这会导致安全漏洞:
这允许攻击者遍历文件系统以访问受限目录之外的文件或目录。
目前尚不清楚究竟是什么导致FindBugs显示此警告,因为您没有发布您的代码,但听起来它可能非常严重。您可能希望实际修复此问题,而不是忽略警告。
答案 2 :(得分:1)
这些都是一样的。
使用String.format
传递静态值很奇怪。不要这样做。
并非所有Findbugs报告都是一个问题。 Findbugs可以报告“误报”。
如上所述,使用new File(a.getPath(), filename)
将路径段添加到另一个路径。这也可能会修复您的Findbugs问题。