2014-01-09 77 views
1

我明白爲什麼使用'shell = True'可能會導致安全風險,如果您有不可信的輸入。但是,我不明白「shell = False」如何避免相同的風險。Python子流程安全

據推測,如果我想允許用戶提供輸入他可能輸入:VAR =「室射頻/」

我的代碼可能只是:

subprocess.call(var,shell=True) # bad stuff 

或者我可以做:

varParts=var.split() 
subprocess.call(varParts,shell=False) # also bad, right? 

這似乎是假設是不會經過處理輸入的麻煩,如我在第二個例子中所做的,因此這將不會發生?

+0

ummmm你逝去的不受信任的輸入您正在運行顯著風險呼叫....你在哪裏任何時候聽到shell = False使它安全? http://docs.python.org/2/library/subprocess.html#frequently-used-arguments ...它所做的就是停止shell注入,這只是一次攻擊...... –

+0

你提供的鏈接有一個註釋說:「警告: 如果與不可信輸入組合,調用shell = True的系統shell可能會帶來安全隱患。」這意味着我使用shell = False提供了一些防禦。 – user3175543

回答

4

對於shell=Falseargs[0]是要執行的程序,並且args[1:]作爲參數傳遞給此程序。

因此,舉例來說,

subprocess.call(['cat','nonexistent;','rm','-rf']) 

調用cat程序併發送3串'nonexistent;''rm''-rf'作爲參數cat。這是非常安全的,儘管無效,因爲-r是對cat的無效選項。

但是,任意的用戶輸入仍然可能是不安全的。如果,例如,你允許用戶控制程序被調用,如

subprocess.call(['rm','-rf']) 
+0

這是很好的信息。所以我猜用戶輸入的用例應該是允許用戶「完成」一個預定義的命令,而不是「提供」一個。我正在使用XML文件來提供一些shell命令,它允許我測試操作系統中是否滿足某些任意條件。該命令可能是一組管道命令。這使得用'shell = False'讀取和執行命令變得困難。我只是想知道,如果shell = False提供了一些內在的防禦措施來防止像'rm -rf /'這樣的危險命令。 – user3175543

+0

如果XML指定要運行的命令,那麼執行'subprocess.call'具有固有的危險性。也許你可以將腳本作爲[有限權限的用戶]來運行(http://askubuntu.com/questions/253027/how-to-sandbox-bash-shell-to-affect-only-current-directory)。 – unutbu