2017-11-08 1 views
1

ディレクトリトラバーサル攻撃を阻止するための検証用の正規表現を作成しようとしています。私はユーザーがC:\ tempディレクトリ内の何かを指定できるようにしたい。したがって、以下は細かいことです。REGEXでディレクトリトラバーサルを停止する

c:\temp\hello\world.txt 

しかし、明らかに、以下のディレクトリは受け入れられません。

c:\temp\..\Windows\world.txt 

私の問題は、どのようにして1つのピリオド(。)を使用できるかわかりませんが、2つではありません。私はエクステンションのために明らかに1つ(world.txt)が必要ですが、2つを持つことはできません。 [^ \ \。]

^([c]:\\)\\?(temp)([^(\.\.)]){0,200}$ 

は、だから私はない二つの期間を言うしようとしていますし、\\:これは私がこれまで持っているものでしょうか?それはエスケープされたディレクトリも受け入れるからです。前もって感謝します。

+2

に0から任意の文字に一致しますか? –

+0

ディレクトリの検証について他にどのように進むべきかについてはあまりよく分かりません。 C#コードビハインドのaspxアプリケーションです。私は、より良い方法があればそれを開いています。 – meowcat

+2

https://stackoverflow.com/questions/401304/how-does-one-extract-each-folder-name-from-a-path –

答えて

1

あなたはこれで試すことがあります。ここでは

^(c:\\)\\?(temp)(?!.*\.\.).{0,200}$ 

私は連続したドットが存在しないことを確実にするために、あなたの正規表現ビットを変更しています。

  1. (?!.*\.\.)この負の表情が先にc:\temp一部が発見された右 後にスキャンを開始します。 Itdは文字列の終わりまでスキャンし、真(これは連続するドットがないことを意味する)を返す場合、次の部分はアクションをとります。ここ
  2. .{0,200}ドットを使用すると、正規表現は、ここで適切なツールであると思わせる何200回

Regex Demo

+0

お返事いただいたすべての人に、私は代替の方法を見ていますが、Rizwanの答えは正しいとマークしています...それは唯一の実際の回答であり、正規表現が機能しているからです:) – meowcat

関連する問題