文件位置使用String格式

时间:2013-03-26 17:04:46

标签: java string string.format

在Java中,这些是相同的:

new File (a.getPath() + filename);
new File (String.format(a.getPath() + filename));

我在findbugs中收到一些警告,第二个选项似乎解决了这个问题。

3 个答案:

答案 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)

  1. 这些都是一样的。

  2. 使用String.format传递静态值很奇怪。不要这样做。

  3. 并非所有Findbugs报告都是一个问题。 Findbugs可以报告“误报”。

  4. 如上所述,使用new File(a.getPath(), filename)将路径段添加到另一个路径。这也可能会修复您的Findbugs问题。