PHP.ini 中应禁用的危险函数(disable_functions)
这些函数通常用于执行系统命令、操作系统文件、建立系统级连接等。在 共享服务器、生产环境、虚拟主机、网站托管、云服务器 中,为了防止 PHP 被利用执行恶意代码,建议统一禁用。
⚠️ 注意:禁用后某些程序(如 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 中禁用这些函数
- 编辑 PHP 配置文件(一般是:
/etc/php.ini或/etc/php/7.x/fpm/php.ini)
vim /etc/php.ini
- 找到以下项目:
disable_functions =
- 将需禁用的函数添加进去,例如:
disable_functions = exec,passthru,shell_exec,system,proc_open,proc_get_status,popen,phpinfo,symlink,putenv,scandir,chgrp,chown,stream_socket_server,pfsockopen
⚠️ 注意:函数之间用 英文逗号 , 分隔,无空格。
三、推荐的禁用函数组合(通用生产环境)
适用于:网站服务器、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
四、禁用函数后常见问题提示
✔ WordPress、Laravel、ThinkPHP 等可能受影响
如你使用的插件/框架需要:
proc_open()(如 Composer)popen()(如后台状态监控)shell_exec()(某些备份插件)phpinfo()(某些诊断工具)
可能需临时解除。
✔ Docker / Cron / Supervisor 管理下的 PHP 项目
如需执行系统命令(备份脚本等),也需开启部分函数。
✔ 生产环境禁用,但开发环境可保留
开发环境可不禁用,以免影响排错。
五、修改后重启 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 类 | 托管环境强烈禁用,自建环境按需 |







