0

Javaでは、これらは同じですか。

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

findbugsで警告が表示され、2番目のオプションで修正されたようです。

4

3 に答える 3

8

どちらも悪いオプションIMOです。ディレクトリ名とファイル名を組み合わせるというアイデアの場合は、そのFileために特別に設計されたコンストラクターを使用します。

new File(a.getPath(), filename)

(使用すると警告が修正される理由String.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 に答える