ファイル名の文字をホワイトリストに登録し、パス操作を防止しようとしています。フロントエンドから返されたファイル名を取得し、解析して指定されたフォルダにあるかどうかを判断します。したがって、ユーザーが指定されたフォルダから逃げる可能性のあるファイルを渡していないことを確認する必要があります。これは有効なファイル名のために私たちのケースがあることを意味:英数字以外の単一のピリオドと単一のスラッシュをすべて削除するRegex
- 英数字
- を単一ドットではなく、ペアを含めることができ、いずれかの方向
- の単一スラッシュを含めることができます。
"APP-TEST-file.20161115.1"は有効ですが、 "/../../ test // \"はファイルシステムをチェックする前にいくつかの文字を削除する必要があります。
ここに私が今持っている正規表現がありますが、残念ながらそれはあまりにも多くを取り除いています。
public static String validateFilePath(String fileName) {
return fileName.replaceAll("[^A-Za-z0-9]+[(\\.\\/)\\+2]", "");
}
ように、 "APP-TEST-file.20161115.1は、" 任意の助けがにappriciatedされるだろう "APP-TEST-file0161115.1"
になっています。
'+ 2'を削除すると' '/../../ test // \" "が' 'test ''に変更されますが、 '' APP-TEST-file.20161115.1' ''はそのままです。これは望ましい出力ですか? – zero01alpha
代表的な入力と予想される出力を投稿してください。 –
これは1つの正規表現で行う必要があるのでしょうか?それらの少数のほんの一握りは、書いたり読むのがずっと簡単です。 – VGR