2012-01-20 43 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應用程序虛擬路徑之外的共享。

我希望能使用Path.Combine解決的路徑,然後檢查,以確保pathCombined開始root,但Path.Combine將保持.... \

此外,我想有可能是其他類型的注入,有人可以在這種情況下做,所以我希望有一個更通用的東西,而不是僅僅爲「..」標記做正則表達式。

回答

5

使用System.IO.Path.GetFullPath可以刪除所有的\..\組合路徑。

然後檢查路徑是否仍以預期前綴開頭。

你應該把它放在異常處理程序中(如果異常會導致問題); GetFullPath將訪問文件系統(對於存在的路徑),並且如果您的惡意客戶端製作了指向無法訪問的文件夾的路徑,您將得到一個異常。

+0

我可能還會確定,即使它是一個有效的路徑,但是在根之外侵入,那麼我會確保任何錯誤消息都不明確。即你不希望有一條消息有「這是一條無效路徑」,而另一條錯誤「這是一個受限制的區域」,因爲第二條錯誤消息告訴他們他們猜到了一條真實的路徑,給他們提供了關於文件結構的信息。 – AaronLS