在PHP中,exec函數被廣泛使用于執行外部命令或者可執行文件。然而,在某些情況下,使用exec函數可能存在一定的安全風險,尤其在共享托管環境下。
運行交互式的命令并提供輸出到Web頁不僅安全性極低,而且極容易被攻擊。例如,以下代碼可以在Web頁面上顯示當前目錄下的文件:
";
}
?>
看上去很不錯的是代碼,但如果攻擊者將參數設為“; ls /”,則會成功執行原有的"ls"命令,還會對/目錄下的所有文件進行列舉,導致系統被攻擊。這種利用安全漏洞的方式在Web開發之中并不罕見。在這種情況下,公司(或個人)可以選擇禁用exec函數。
另外一個開發中容易犯的錯誤是,沒有對exec函數的參數做正確的過濾。由于exec函數可以接受一些特定參數,如路徑、文件名、命令符、弱引號、強引號、通配符、管道等,這些參數如果不做過濾就可能造成危害。例如,以下代碼會將上傳的文件存儲到$dir變量指定的目錄下:
如果攻擊者上傳一個文件名為“;touch /tmp/123456”,則會在/tmp目錄下生成一個新的文件。因此,在使用exec函數時一定要對參數進行正確的過濾。
總之,在共享托管環境下,禁用exec函數可以大大減少Web應用程序的安全風險。當然,如果必須使用exec函數,一定要確保正確過濾用戶輸入的數據。在編寫Web應用程序時,安全性要放在第一個考慮的位置。