2014-02-09 44 views
0

爲什麼被告知,在生產代碼中使用系統功能是不可取的? 這與使用exec系列函數有什麼不同?系統功能在生產代碼中的使用

說明:我在很多地方都讀過它,當我們在商業層面上做某些事時,使用系統函數是不明智的。但是我從來沒有想到可能是什麼問題,以及如何使用exec系列被認爲比系統更好。就我而言,我的擔憂已被闡明

+1

http://stackoverflow.com/questions/732832/php-exec-vs-system-vs-passthru –

+2

如果輸入來自外部來源或用戶,絕對應該避免它或消毒它。例如,您讀取一行數據,然後執行'os.system',用戶可以輸入'echo「Welcome」> test.txt'。這將在您的服務器上創建一個文件。這僅僅是一個例子,實際的攻擊媒介將會非常有趣和危險。 – thefourtheye

+1

在Python中,您應該使用[subprocess](http://docs.python.org/2/library/subprocess.html)模塊(對於[不可信輸入](http://docs.python)使用'shell = False' .org/2/library/subprocess.html#frequently-used-arguments))不是'os'模塊提供的功能。 –

回答

1

此問題標記爲C,php和python。我不知道python,但C和PHP函數system至少在一個方面有所不同:PHP函數有一個可選的第二個參數。

在C中(並且根據文檔,PHP執行同樣的操作),system通過執行/bin/sh -c command來運行該命令。這裏的問題是command是否完全在您的控制之下。如果command是一個常量字符串,那麼您是相當安全的。但是,如果command有任何用戶提供的元素,則最好非常小心。假設您認爲這是向日志添加字符串$foo的好方法。

system ("echo '$foo' >> /var/log/bar"); 
在PHP

不會是一個好主意,因爲$foo可能包含以下(包括引號)

'x && /bin/rm -rf/&& echo ' 

更好地利用類似exec,你不必擔心關於報價,分開參數等(而不是通過/bin/sh),即使這樣你也需要非常小心。