2016-08-16 46 views
0

我需要通過命令行調用一個自定義腳本,這些腳本需要很少的參數並在Linux機器上調用。當前版本容易出現各種shell注入,如何清理用戶給出的參數?參數包括登錄和路徑(Unix或Windows路徑),用戶應該能夠輸入任何可能的路徑(該路徑指的是用戶服務器上的遠程路徑)。如何清理Runtime.exec()中使用的用戶輸入?

的代碼,現在只是看起來是這樣的:

Process process = Runtime.getRuntime().exec("myscript " + login + " " + path); 
+0

啓動沒有參數的腳本,然後通過stdin/out與它通信。你永遠不會保護Runtime.exec。 – matt

回答

-1

驗證的登錄名和路徑使用正則表達式定義簡單的規則。

驗證用戶名:Regular Expression in Java for validating username

驗證路徑:java regular expression to match file path

正則表達式將確定的路徑是否正確格式化。要確定路徑是否實際上是文件系統上的目錄,請使用File對象的isDirectory方法。驗證路徑

+0

問題是,有效路徑可能包含允許某人準備惡意命令的字符,我如何確保提供的路徑只是路徑? – Please

+0

我修改了我的答案,顯示如何確定給定的路徑是否有效。 – eighthrazz

0

的一種方式是使用FileSystem方法getPath()構建Path對象,然後通過toString()(或toAbsolutePath().toString())得到的字符串表示背面。這樣,您可以確保只處理有效的路徑。但是,這不會爲典型的路徑注入附件節省您使用例如「../../../../somecriticalsystemfolder」。

1

this answer,使用ProcessBuilder代替:

ProcessBuilder pb = new ProcessBuilder("myscript", login, path); 

這應該採取措施防止外殼注塑。

路徑注入不應該是一個問題,如果路徑僅指路徑自己的系統,你說:

路徑是指遠程路徑的用戶服務器上

的風險如果服務器以某種方式與「路徑」聯繫,那麼您的問題就不清楚了。它是什麼類型的路徑?一個URL路徑,一個Samba共享?

您可能需要針對Server Side Request Forgery加以確保。這涉及驗證用戶輸入以檢查它是指外部服務器,而不是您自己的網絡中的一個。