PHP.ini 中应禁用的高危函数(disable_functions)优化版教程

PHP.ini 中应禁用的危险函数(disable_functions)

这些函数通常用于执行系统命令、操作系统文件、建立系统级连接等。在 共享服务器、生产环境、虚拟主机、网站托管、云服务器 中,为了防止 PHP 被利用执行恶意代码,建议统一禁用。

:warning: 注意:禁用后某些程序(如 WordPress、Discuz、Laravel 工具)可能依赖部分函数。 请按需启用/禁用。


一、PHP 中常见的高危函数及说明

以下列出常见的高危函数,按“危险等级”分类,并附上用途说明。


1. 命令执行类(高危 ★★★★★

这些函数可以直接执行系统命令,是黑客最常利用的突破点。

函数 说明 危险等级
exec() 执行系统命令,返回结果 ★★★★★
system() 执行命令并输出结果 ★★★★★
passthru() 执行命令并输出 raw 结果 ★★★★★
shell_exec() 执行系统 Shell 命令 ★★★★★
popen() 执行命令并返回文件指针 ★★★★★
proc_open() 打开系统进程 ★★★★★
proc_get_status() 获取由 proc_open 创建的进程状态 ★★★★★

2. 文件属主/权限/链接操作类(高危 ★★★★☆

会影响系统文件安全。

函数 说明 危险等级
chroot() 改变 PHP 进程根目录 ★★★★☆
chgrp() 修改文件所属组 ★★★★☆
chown() 修改文件所有者 ★★★★☆
symlink() 创建符号链接 ★★★★☆
readlink() 读取符号链接内容 ★★★☆☆

3. Socket / 网络类(高危 ★★★★☆

可创建反向 shell、监听端口等。

函数 说明 危险等级
stream_socket_server() 创建 socket 服务器 ★★★★☆
pfsockopen() 创建持久 socket 连接 ★★★★☆

4. PHP 环境修改类(高危 ★★★★☆

可任意改变 PHP 的运行环境,容易被利用进行提权操作。

函数 说明 危险等级
ini_set() 修改 PHP 配置 ★★★★☆
ini_restore() 恢复配置 ★★★★☆
ini_alter() ini_set 别名 ★★★★☆

5. 动态加载模块类(高危 ★★★★★

函数 说明 危险等级
dl() 运行时动态加载 PHP 扩展 ★★★★★

6. 系统信息类(中危 ★★★☆☆

函数 说明 危险等级
phpinfo() 输出 PHP 环境信息(可泄露敏感信息) ★★★☆☆
syslog() 写系统日志 ★★★☆☆
scandir() 列出目录内容 ★★★☆☆

7. 其他功能性但存在漏洞历史的函数

函数 说明 危险等级
putenv() 修改系统环境变量(曾被利用执行系统命令) ★★★★☆
error_log() 某些旧版本可绕过 safe_mode ★★☆☆☆

二、如何在 php.ini 中禁用这些函数

  1. 编辑 PHP 配置文件(一般是:/etc/php.ini/etc/php/7.x/fpm/php.ini
vim /etc/php.ini
  1. 找到以下项目:
disable_functions =
  1. 将需禁用的函数添加进去,例如:
disable_functions = exec,passthru,shell_exec,system,proc_open,proc_get_status,popen,phpinfo,symlink,putenv,scandir,chgrp,chown,stream_socket_server,pfsockopen

:warning: 注意:函数之间用 英文逗号 , 分隔,无空格。


三、推荐的禁用函数组合(通用生产环境)

适用于:网站服务器、PHP-FPM、LNMP/LAMP、Docker、Nginx 环境。

disable_functions = exec,passthru,shell_exec,system,proc_open,proc_get_status,popen,symlink,chgrp,chown,stream_socket_server,pfsockopen,putenv,ini_set,ini_restore,dl,phpinfo

四、禁用函数后常见问题提示

:check_mark: WordPress、Laravel、ThinkPHP 等可能受影响

如你使用的插件/框架需要:

  • proc_open()(如 Composer)
  • popen()(如后台状态监控)
  • shell_exec()(某些备份插件)
  • phpinfo()(某些诊断工具)

可能需临时解除。

:check_mark: Docker / Cron / Supervisor 管理下的 PHP 项目

如需执行系统命令(备份脚本等),也需开启部分函数。

:check_mark: 生产环境禁用,但开发环境可保留

开发环境可不禁用,以免影响排错。


五、修改后重启 PHP 服务

根据环境不同:

Nginx + PHP-FPM

systemctl restart php-fpm

Apache

systemctl restart httpd

Debian / Ubuntu

systemctl restart php7.4-fpm
systemctl restart php8.1-fpm

六、总结

分类 是否建议禁用
命令执行类 强烈建议禁用
系统/文件属主类 建议禁用
PHP 配置修改类 可根据情况禁用
动态加载扩展类 强烈建议禁用
系统信息类 视情况禁用
Socket 类 托管环境强烈禁用,自建环境按需