0

在 Java 中,这些是否相同:

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

我在 findbugs 中收到了一些警告,第二个选项似乎可以修复它。

4

3 回答 3

8

两者都是国际海事组织的糟糕选择。如果想法是将目录名与文件名结合起来,请使用File专门为此设计的构造函数:

new File(a.getPath(), filename)

(我不明白为什么 usingString.format会修复警告,但由于我们不知道警告是什么,所以很难猜测。但它肯定会使它更加脆弱,因为字符串将被解释为格式模式,大概不是。)

于 2013-03-26T17:05:39.937 回答
2

String.format()除非您的字符串是格式字符串并且您添加了额外的参数,否则不会执行任何操作,因此在这种情况下,您似乎只是在隐藏警告。FindBugs 很可能知道这new File(a + b);可能是一个错误,但无法判断是否new File(someFunction());是一个错误。

根据PT_RELATIVE_PATH_TRAVERSAL 的文档

该软件使用 HTTP 请求参数来构造应位于受限目录中的路径名,但它不能正确中和诸如“..”之类的序列,这些序列可以解析到该目录之外的位置。有关详细信息,请参阅 http://cwe.mitre.org/data/definitions/23.html

FindBugs 只查找最明显、最明显的相对路径遍历情况。如果 FindBugs 发现了任何漏洞,则几乎可以肯定您还有更多 FindBugs 未报告的漏洞。如果您担心相对路径遍历,您应该认真考虑使用商业静态分析或渗透测试工具。

所以,这个String.format()技巧奏效了,因为 FindBugs 只能捕捉到明显的情况,但更大的问题似乎是这会导致安全漏洞:

这允许攻击者遍历文件系统来访问受限目录之外的文件或目录。

目前尚不清楚究竟是什么导致 FindBugs 显示此警告,因为您没有发布您的代码,但听起来它可能非常严重。您可能希望实际解决此问题,而不是忽略警告。

于 2013-03-26T17:07:03.600 回答
1
  1. 那些是一样的。

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

  3. 并非 Findbugs 报告的所有内容都是问题。Findbugs 可以报告“误报”。

如上所述,用于new File(a.getPath(), filename)将路径段添加到另一个路径。这也可以解决您的 Findbugs 问题。

于 2013-03-26T17:08:27.237 回答