首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 禁用危險函數配置指南:disable_functions 最佳實踐與檢測腳本

     編輯:PHP 綜合知識

核心配置

編輯 php.ini,設置 disable_functions 指令,多個函數用半角逗號分隔:

disable_functions = passthru,exec,system,popen,proc_open,proc_get_status,shell_exec,pcntl_exec,pcntl_fork,pcntl_signal,pcntl_waitpid,pcntl_wexitstatus,pcntl_wifexited,pcntl_wifsignaled,pcntl_wifstopped,pcntl_wstopsig,pcntl_wtermsig,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_get_last_error,pcntl_strerror,chroot,chgrp,chown,dl,syslog,openlog,closelog,apache_child_terminate,apache_get_modules,apache_get_version,apache_getenv,apache_lookup_uri,apache_note,apache_request_headers,apache_reset_timeout,apache_response_headers,apache_setenv,define_syslog_variables,posix_kill,posix_mkfifo,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid

分類解釋

類別代表函數風險
命令執行exec, system, passthru, shell_exec, proc_open, popen任意代碼執行,獲取服務器控制權
進程控制pcntl_* 系列Fork 炸彈、信號劫持、守護進程竄改
文件系統高級chroot, chgrp, chown, dl權限提升、動態加載惡意擴展
網絡/服務apache_*, syslog*, openlog服務器信息洩露、日志注入
POSIX 權限posix_set*, posix_kill用戶/組切換、進程殺害
信息洩露show_source, highlight_file源碼泄露

環境差異化配置

共享虛擬主機 (最嚴格)

disable_functions = exec,system,passthru,shell_exec,proc_open,proc_get_status,popen,pclose,dl,chroot,chgrp,chown,apache_child_terminate,apache_get_modules,apache_get_version,apache_getenv,apache_lookup_uri,apache_note,apache_request_headers,apache_reset_timeout,apache_response_headers,apache_setenv,define_syslog_variables,posix_kill,posix_mkfifo,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,show_source,highlight_file,symlink,link,readlink,stream_socket_server,stream_socket_client,ftp_connect,ftp_login,ftp_pasv,ftp_get,ftp_put,ftp_delete,ftp_mkdir,ftp_rmdir,ftp_chdir,ftp_nlist,ftp_rawlist,ftp_size,ftp_mdtm,ftp_systype,ftp_pwd,ftp_cdup,ftp_chmod,ftp_alloc,ftp_raw,ftp_set_option,ftp_get_option

VPS/獨立服務器 (按需開放)

# 僅禁用最高風險函數,保留 CLI 腳本所需
disable_functions = exec,system,passthru,shell_exec,proc_open,pcntl_fork,pcntl_signal,chroot,dl,show_source,highlight_file,symlink

Docker 容器 (最小權限原則)

# 容器內通常不需這些函數
disable_functions = exec,system,passthru,shell_exec,proc_open,proc_get_status,popen,pclose,pcntl_*,posix_*,apache_*,dl,chroot,show_source,highlight_file

檢測腳本:一鍵查看當前禁用列表

<?php
header('Content-Type: text/html; charset=utf-8');

$disabled = ini_get('disable_functions');
$list = $disabled ? array_map('trim', explode(',', $disabled)) : [];

echo "

PHP 禁用函數檢測

"; echo "

PHP 版本: " . PHP_VERSION . "

"; echo "

配置文件: " . php_ini_loaded_file() . "

"; echo "

禁用函數數量: " . count($list) . "

"; if (empty($list)) { echo "
⚠️ 警告:未禁用任何危險函數!生產環境極不安全。
"; } else { echo ""; echo ""; $riskMap = [ 'exec'=>'高','system'=>'高','passthru'=>'高','shell_exec'=>'高','proc_open'=>'高', 'popen'=>'高','proc_get_status'=>'中','pcntl_fork'=>'高','pcntl_signal'=>'高', 'chroot'=>'高','dl'=>'高','show_source'=>'中','highlight_file'=>'中', 'symlink'=>'中','stream_socket_server'=>'中','ftp_connect'=>'低', ]; foreach ($list as $func) { $risk = $riskMap[$func] ?? '低'; $color = $risk === '高' ? '#ff4444' : ($risk === '中' ? '#ffaa00' : '#44aa44'); echo ""; } echo "
函數名風險等級說明
$func$risk" . getFuncDesc($func) . "
"; } function getFuncDesc($func) { $descs = [ 'exec'=>'執行外部程序','system'=>'執行命令並輸出','passthru'=>'執行命令直接輸出', 'shell_exec'=>'執行命令返回字符串','proc_open'=>'打開進程管道','popen'=>'打開進程文件指針', 'pcntl_fork'=>'創建子進程','pcntl_signal'=>'信號處理','chroot'=>'改變根目錄', 'dl'=>'動態加載擴展','show_source'=>'顯示源碼','highlight_file'=>'高亮顯示文件', 'symlink'=>'創建符號鏈接','stream_socket_server'=>'創建Socket服務端', ]; return $descs[$func] ?? '無描述'; }

驗證配置生效

# 創建測試文件 test_disable.php


# 訪問/執行
php test_disable.php
# 預期輸出:Warning: system() has been disabled for security reasons

常見誤區

  • 以為禁用了就絕對安全:繞過手段眾多 (LD_PRELOAD, PHP-FPM 配置, 反序列化鏈等),需纵深防禦
  • 開發環境也全禁用:導致 Composer、藝術家、測試工具無法運行,建議區分環境配置
  • 忽略了類方法調用:new COM()、Imagick::execute() 等仍可執行命令
  • 未重啟 PHP-FPM/Apache:配置修改需重載進程生效

纵深防禦建議

  1. open_basedir 限制文件訪問範圍
  2. expose_php = Off 隱藏版本信息
  3. display_errors = Off 生產環境關閉錯誤顯示
  4. 禁用不必要的 PHP 擴展 (如 com_dotnet, ffi)
  5. Web 目錄權限最小化 (不可寫入腳本目錄)
  6. WAF/IDS 監控異常調用
  7. 定期掃描 disable_functions 繞過漏洞 (如 CVE-2021-21703)

總結

disable_functions 是 PHP 安全基線的第一道防線,**生產環境必須配置**,並根據業務場景精細調整。配合 open_basedir、權限最小化、WAF 等措施構建纵深防禦體系。定期使用檢測腳本驗證配置生效,納入安全基線巡檢項目。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved