2012-01-20 10 views
2

UNCパスを動的に構築する場合、特定のルートパスに制約するためにどのような手法を使用する必要があります。UNCパスの妥当性検査( .. .. と同様の注入を防ぐ)

string root = @"\\Blah\Share\YouStayHere\"; 

//pretend second string is from a query string a user could manipulate 
string path = @"\\Blah\Share\YouStayHere\" + @"..\..\TresspassingQueryString"; 

if(! SomeValidation(root, path)) { throw new Exception("you dirty bastard"... 

は、これはおそらく権限で管理されるべきで付与されたが、権限はオプションではありませんので、多分他のディレクトリには、同じアプリケーション内の別のASPページのコンテキストでアクセス可能です。

私は、Request.MapPathがアプリケーションのディレクトリ内でアクセスを維持するために使用できることは知っていますが、これは.NETアプリケーションの仮想パス外の共有です。

私はパスを解決してからpathCombinedrootから始まることを確認するためにチェックするためにPath.Combineを使用することを期待していたが、Path.Combineが.... \

また、私はそこかもしれないと想像し続けます誰かがこのような状況でできる他のタイプの注射であるので、私は ".. \"トークンの正規表現を行うよりも一般的なものを期待していました。

答えて

5

System.IO.Path.GetFullPathを使用して、すべての\..\が削除された結合パスを取得します。

次に、パスがまだ予想されるプレフィックスで開始していることを確認します。

これを例外ハンドラに入れる必要があります(例外によって問題が発生する場合)。 GetFullPathは(存在するパスのために)ファイルシステムにアクセスし、あなたの悪意のあるクライアントがアクセスできないフォルダを指すパスを作成した場合、例外が発生します。

+0

有効なパスであってもルート外に侵入していても、エラーメッセージがあいまいであることを確認しています。私。 2番目のエラーメッセージは実際のパスを推測してファイル構造に関する情報を提供しているため、「これは無効なパスです」というメッセージと「これは制限された領域です」という1つのメッセージを持つことは望ましくありません。 。 – AaronLS

関連する問題