2017-06-12 12 views
0

私は、解凍して私たちのサーバーに保存したzipファイルをアップロードできるWebサービスを構築しています。Javas Fileコンストラクタを使ってパスのトラバーサルが可能ですか?

私が指定したパス内のファイルを開くには、次の関数を作成しました:

private File secureOpenFile(String fileName, String directorypath){ 
     return new File(directorypath, fileName); 
} 

しかし、それはパストラバーサルの可能性を持っているとして、セキュリティスキャンは、これは安全ではないことを私に伝えます。引数を与える(「../../notsafe」、 『uploadfolder』)は、Fileクラスのドキュメントに、私は次を発見した、しかし...悪意のある攻撃者が他のファイルを上書きする

を可能にする:https://docs.oracle.com/javase/7/docs/api/java/io/File.html#File(java.io.File,%20java.lang.String)

それ以外の場合、親抽象パス名はディレクトリを表し、子パス名文字列はディレクトリまたはファイルのいずれかを表します。子パス名文字列が絶対パスであれば、それはシステム依存の方法で相対パス名に変換されます。 parentが空の抽象パス名である場合、新しいFileインスタンスは、子を抽象パス名に変換し、システム依存のデフォルトディレクトリに対して結果を解決することによって作成されます。それ以外の場合、各パス名文字列は抽象パス名に変換され、子抽象パス名は親に対して解決されます。

私は次のように解釈しました。親フォルダを残しません。私は正しいかどうか?このコードは安全ですか?今の場合:このセキュリティ上の問題を解決する最善の方法は何ですか?

+0

あなたはユーザーからのパラメータの入力を受け取りますか? – ProgrammerBoy

+0

Hey ProgrammerBoy。第2引数のファイル名は、ユーザーがアップロードしたzipファイルに由来します。私はユーザーがこのzipファイルに何か変なものを置くことができると思うので、私はその入力を信頼しません... – rmeertens

答えて

1

はい、可能です。

...子抽象パス名は親に対して解決されます。

はちょうど子供のパスを解決するときに、親パスがベースとして使用されている意味するが、子パスが..が含まれている場合、結果は親の外になります。

など。従ってtargetの外側/Users/example/projects/sample/pom.xml

new File("/Users/example/projects/sample/target", "../pom.xml").getCanonicalFile(); 

結果、。

つまり、要するに、あなたはこれを自分自身から守る必要があります。

関連する問題