2016-12-06 3 views
4

ファイル名の文字をホワイトリストに登録し、パス操作を防止しようとしています。フロントエンドから返されたファイル名を取得し、解析して指定されたフォルダにあるかどうかを判断します。したがって、ユーザーが指定されたフォルダから逃げる可能性のあるファイルを渡していないことを確認する必要があります。これは有効なファイル名のために私たちのケースがあることを意味:英数字以外の単一のピリオドと単一のスラッシュをすべて削除する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"

になっています。

+0

'+ 2'を削除すると' '/../../ test // \" "が' 'test ''に変更されますが、 '' APP-TEST-file.20161115.1' ''はそのままです。これは望ましい出力ですか? – zero01alpha

+0

代表的な入力と予想される出力を投稿してください。 –

+0

これは1つの正規表現で行う必要があるのでしょうか?それらの少数のほんの一握りは、書いたり読むのがずっと簡単です。 – VGR

答えて

2

このようなものが欲しいですか? (私はあなたが望むものについては明らかではないよ!)

String filename = "APP-TEST-file.20161115.1"; 
// replace two consecutive dots with a single dot 
filename = filename.replaceAll("\\.+", "."); 
// replace two consecutive forward slash with a single forward slash 
filename = filename.replaceAll("/+", "/"); 
// replace two consecutive baskslash with a backslash 
filename = filename.replaceAll("\\\\+", "\\\\"); 
// allow alphanumeric characters, dots and both type of slashes 
filename = filename.replaceAll("[^A-Za-z0-9./\\\\]+", ""); 
System.out.println(filename); 

それは出力します、それは印刷し

APPTESTfile.20161115.1 

filename="/../../test//\\"場合 - /././test/\が。

+0

私は愚か者であり、このすべてを続けていたはずです。これは私が大きな正規表現をshoehornしようとするものです。ありがとう。 – iamthereplicant

+0

*「どちらの方向のスラッシュも含めることができます」*ルールに従って、 '' // \ '''を ''/''または '' \ ''に崩さないでください。あなたのコードは ''/\ ''に崩壊しました。 – Andreas

+0

@Andreas私が理解していること、OPは//への崩壊を望んでいます。それが私がそれを書いた理由です。とにかく、私はあなたが私のポストに書いたことを見ることができるようにはわかりませんでした - 「あなたが望むものについてはっきりしていません! –

関連する問題