2012-12-13 111 views
0

我試圖寫一個簡單的C#函數來驗證一個完整的路徑由用戶輸入的shell腳本,以避免幾件事情:如何驗證Unix路徑?

  • 的路徑是正確的格式,沒有無效的符號,像空格或分號
  • 沒有可疑的命令,例如rm -rf /
  • 路徑表示一個完整的路徑,也沒有親戚
  • 如果腳本確實存在

功能將採取類似的形式並不重要,

public bool IsUnixPathValid(string path) 
{ 
    return !path.IsEmptyOrNull() 
     && path.StartsWith("/") 
     && !path.ContainsCharacters(";', \"") 
} 

問題:是否有現成的圖書館可以執行此類操作?如果不是,最好的辦法是什麼,我應該注意些什麼細節(想想安全)。

+0

@Ramhound我正在尋找實際的實現,而是檢查Unix路徑時的策略和安全問題。 – rae1

+0

@Ramhound用當前的實現更新了這個問題。 – rae1

回答

4

如果你還沒有嘗試驗證的任何文件是否實際存在在指定的路徑,那麼可能是你應該做的是檢查的路徑與/開始(因爲你只想要絕對路徑)的唯一的事情,沒有嵌入NUL(0)字節(因爲POSIX路徑不能包含這些)。而已。絕對其他任何東西都可以成爲有效的路徑。值得注意的是,路徑中允許使用空格和分號。

我想你也可以檢查多個相鄰的斜線,因爲這些斜線是多餘的......但是它們仍然被接受(每組斜線具有與單斜線相同的含義),所以它們實際上並不是無效的。

檢查嵌入路徑中的「rm -rf /」等可疑字符串是個壞主意。如果由於直接發送到系統命令的未加引號的路徑導致安全問題,那麼您需要解決這些安全問題(或者通過引用適當的路徑,或者更好地通過不通過它們來解析它們的shell),而不是將其列入黑名單很少選擇嵌入字符串。如果你是黑名單,那麼你很可能會錯過本應該列入黑名單的內容,而且,你可能會拒絕那些實際上是有效的良性道路。

+0

+1優秀的答案。謝謝! – rae1

+0

如果您想要一個有效的路徑到一個普通文件而不是一個目錄,檢查路徑是否以斜線結尾也可能很有用。 (或者相反)。 – GKFX