在 Java 中,这些是否相同:
new File (a.getPath() + filename);
new File (String.format(a.getPath() + filename));
我在 findbugs 中收到了一些警告,第二个选项似乎可以修复它。
在 Java 中,这些是否相同:
new File (a.getPath() + filename);
new File (String.format(a.getPath() + filename));
我在 findbugs 中收到了一些警告,第二个选项似乎可以修复它。
两者都是国际海事组织的糟糕选择。如果想法是将目录名与文件名结合起来,请使用File
专门为此设计的构造函数:
new File(a.getPath(), filename)
(我不明白为什么 usingString.format
会修复警告,但由于我们不知道警告是什么,所以很难猜测。但它肯定会使它更加脆弱,因为字符串将被解释为格式模式,大概不是。)
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 显示此警告,因为您没有发布您的代码,但听起来它可能非常严重。您可能希望实际解决此问题,而不是忽略警告。
那些是一样的。
用于String.format
传递静态值很奇怪。不要这样做。
并非 Findbugs 报告的所有内容都是问题。Findbugs 可以报告“误报”。
如上所述,用于new File(a.getPath(), filename)
将路径段添加到另一个路径。这也可以解决您的 Findbugs 问题。