常見的 PHP 保安問題
阿恆
HKPUG 經常報導專家們提出有關 PHP 安全性的忠告,其實很多忠告都是幾乎「常識」的水平,即使沒有專家的提點也不應該觸犯,但是我們仍然不斷在討論區見到網友編寫漏洞百出的 PHP 程式,看得人觸目驚心,這裏我們再次介紹一篇有關 PHP 安全性的建議。
Justin Silverston 在他的網誌中列出其中五個常見的 PHP 保安盲點:
- 呼叫系統程式:在 PHP 中有幾個方法呼叫系統程式,包括 system()、exec() 和 passthru(),Justin 說若果不小心使用的話,這幾個函式很容易被用戶濫用來肆意執行系統指令,盜取系統中的資料和檔案。
- Justin 一再強調在任何情況下都不能信任用戶輸入的資料,PHP 提供兩個函式 escapeshellarg() 和 escapeshellcmd() 來消除用戶輸入資料中的潛在危險,使這些資料用在呼叫系統程式時不能做成惡意的破壞。
- 檔案上載:Justin 警告 PHP 內核不會替我們檢查上載的檔案是否包含不合法的名稱、不正確的延伸檔名、或者不正確的大小,這一切都要由應用程式透過 $_FILE 進行驗證,利用 move_uploaded_file() 和 is_uploaded_file() 也可以提升安全程度。
- 嵌入檔案(including files):在 PHP 中我們可以透過 include()、include_once()、require() 和 require_once() 來嵌入檔案,Justin 警告我們儘管這是一個十分有用的功能,但必須小心進行,例如嵌入遠端檔案便十分危險,倚賴用戶輸入的資料作為檔案名稱也很有問題,這些存在潛在的安全性風險,真的需要這樣做的話必須確保所有資料均經過嚴格的檢驗。