我在審查一個Web應用程序,該應用程序公開用戶可通過Web界面更改其unix密碼的功能。經過身份驗證的Web用戶提供了他的unix用戶名和他想要的密碼。命令注入在這裏是一個明顯的攻擊向量。當部分命令來自用戶輸入時,在Linux服務器上執行命令的安全方式
輸入被驗證和消毒通過強制用戶名是僅在:/^[a-zA-Z0-9]+$/
此後它類似的信息(在python):
p = os.popen("/usr/bin/passwd " + username, "w")
等等等等。
如果他們沒有這個正則表達式,像jon; rm -rf
這樣的用戶名對系統或popen來說是災難性的。
我wan't更根本的是不會讓我傷害自己即使這樣糟糕的輸入方式使得該系統/ POPEN調用。 (例如subprocess)
有沒有更安全的方法來做到這一點或驗證輸入仍然是唯一的防禦?如果有一種執行命令的標準方法,其中一部分命令來自用戶輸入,我一直在尋找比system/popen更安全的方法或完全不同的方法。
做它的正則表達式的方法是標準的東西,建立一個完整的沙盒是一個__LOT__更多的工作。 – orlp 2012-02-20 17:57:02
@nightcracker:不,在這種情況下這樣做的正則表達式不是標準的東西。使用正確的模塊是標準的東西。 – 2012-02-20 17:59:01
+1因爲想要正確地做到這一點。有人在SO上至少每天發佈一次公然注入易受攻擊的代碼。 – 2012-02-20 18:00:01