在 PHP 中,exec() 和 system() 都是可以用來執行外部程序的函數,這兩個函數在執行命令時非常方便,但也存在一定的安全風險,本文將介紹這兩個方法的使用方法和可能存在的風險,并給出相應的解決方法。
exec() 函數是執行系統命令的函數之一,通過 exec() 函數可以直接執行外部程序,例如:
$output = array(); $command = 'ls -l'; exec($command, $output); var_dump($output);
上述代碼中,我們使用 exec() 函數執行了系統命令 'ls -l',將輸出結果保存到 $output 數組中,并通過 var_dump() 函數輸出了結果。其輸出結果類似于:
array(4) { [0]=>string(37) "total 4 -rw-r--r-- 1 web web 228 Mar 22 14:29 first.php -rw-r--r-- 1 web web 444 Mar 22 14:35 second.php drwxr-xr-x 2 web web 6 Mar 22 14:33 test " [1]=>string(0) "" [2]=>string(0) "" [3]=>string(0) "" }
同樣的,system() 函數也是執行系統命令的函數之一,二者區別在于:
- exec() 函數只返回最后一行結果
- system() 函數則將所有輸出結果輸出到屏幕上
舉個例子:
$command = 'echo "Hello, world!"'; system($command);
該命令執行后,頁面上會直接輸出 'Hello, world!'。
然而,exec() 函數和 system() 函數的使用并非完全安全。由于命令是由用戶提供的,若用戶輸入惡意代碼,那么便有可能對整個系統造成不可預料的破壞。例如,有人可以這樣寫代碼:
$word = $_GET['word']; exec("grep $word /etc/passwd");
如果有人在控制臺輸入 ?word=*+* ,那么 $command 變量就會變成下列命令:
grep * * /etc/passwd
這樣便會匹配到所有的文件,造成非常危險的后果。
為了防止這樣的后果發生,我們可以這樣來解決:
$word = $_GET['word']; $word = escapeshellcmd($word); exec("grep $word /etc/passwd");
這樣,$word 中的所有命令都會被轉義,避免了命令注入的風險。
總的來說,exec() 函數和 system() 函數的使用非常方便,但是在使用時一定要注意安全性問題。在使用時,需要認真思考可用性和安全性之間的權衡,才能夠更好的保障系統的正常運行。