2012-02-20 51 views
3

我在審查一個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更安全的方法或完全不同的方法。

+0

做它的正則表達式的方法是標準的東西,建立一個完整的沙盒是一個__LOT__更多的工作。 – orlp 2012-02-20 17:57:02

+0

@nightcracker:不,在這種情況下這樣做的正則表達式不是標準的東西。使用正確的模塊是標準的東西。 – 2012-02-20 17:59:01

+1

+1因爲想要正確地做到這一點。有人在SO上至少每天發佈一次公然注入易受攻擊的代碼。 – 2012-02-20 18:00:01

回答

3

可能報價輸入自己:

import pipes 
p = os.popen("/usr/bin/passwd " + pipes.quote(username), 'w') 

os.popen但反對和pipes.quote是一個未公開的函數,所以你會好得多隻是用subprocess模塊:

import subprocess 
p = subprocess.Popen(["/usr/bin/passwd", username]) 
+0

完美,謝謝你的回答。子過程也是我最好的猜測。 – CodeExpress 2012-02-21 19:52:06