open_basedir修改 httpd.conf(Apache)或 php.ini:
php_admin_value open_basedir "/usr/local/apache/htdocs"
效果:腳本嘗試讀寫該目錄外檔案將報錯 open_basedir restriction in effect。
在 php.ini 設定 disable_functions:
; 基礎防禦:禁用命令執行
disable_functions = passthru,exec,shell_exec,system
; 進階防禦:同時禁用檔案系統操作
disable_functions = passthru,exec,shell_exec,system,
fopen,mkdir,rmdir,chmod,unlink,dir,
fread,fclose,fwrite,file_exists,
closedir,is_dir,readdir,opendir,
fileperms,copy,delfile
代價:以檔案為基礎的資料庫(如 SQLite、flat-file CMS)將無法運作,需權衡業務需求。
預設 Apache 以 SYSTEM 執行,風險極高。建立低權限帳號:
net user apache fuckmicrosoft /add
net localgroup users apache /del
服務屬性 → 登入 → 選擇此帳號 → 重啟 Apache。進一步可針對目錄設定 ACL,實現最小權限原則。
safe_mode(PHP 5.4+ 已移除,改用上述方案)「木馬拿我們沒轍」是相對的,分層防禦才能將風險降至最低。開發階段就應遵循最小權限原則,避免過度依賴 disable_functions 這類事後補丁。