必须在php.ini中配置disable_functions才有效,其他方式如ini_set()或.htaccess均无效;需通过phpinfo()确认真实加载路径,严格按小写、无空格、英文逗号分隔格式书写函数名,并重启web服务验证生效。

必须在 php.ini 里改,其他地方写 disable_functions 都无效。 这不是 PHP 运行时能控制的选项,而是启动时由 Zend 引擎读取并锁定的配置项。哪怕你用 ini_set()、.htaccess、apache2.conf 或虚拟主机配置去设,Apache 重启后也完全不认。
怎么找到真正生效的 php.ini 文件
很多人改了错的 php.ini,结果禁用列表没起作用。根本原因是 XAMPP 可能加载了多个配置文件,但只认其中一个。
- 在浏览器访问
http://localhost/dashboard/phpinfo.php(或自己写个<?php phpinfo(); ?>页面) - 搜索
Loaded Configuration File这一行,它显示的路径才是 PHP 实际加载的php.ini - 常见路径有:
C:\xampp\php\php.ini(Windows)、/opt/lampp/etc/php.ini(Linux) - 别直接编辑
C:\xampp\php\php.ini-development或-production副本——它们只是模板,不会被加载
disable_functions 的正确写法和常见错误
语法极简,但空格、逗号、拼写错一个就失效。比如 system 后面多一个空格,PHP 就当它不存在。
- 必须用英文逗号分隔,不能有空格:
disable_functions = exec,shell_exec,system,passthru,proc_open,popen,dl,curl_exec,curl_multi_exec - 函数名大小写敏感,
SHELL_EXEC或Shell_Exec都不会被识别 - 禁用
dl()很关键——它是绕过disable_functions的常用入口,尤其在 Linux 下可加载恶意.so - 别漏掉反引号执行:
`ls -l`等价于shell_exec('ls -l'),所以禁了shell_exec就能拦住大部分反引号调用
改完必须重启 Apache,且注意权限与 SELinux 干扰
修改 php.ini 后不重启服务,配置永远不会生效;而某些系统还会因权限或安全模块阻止新配置加载。
- Windows:用 XAMPP 控制面板点
Stop再StartApache;别只点Restart,有时状态没刷新 - Linux:
sudo /opt/lampp/lampp restart,不是systemctl restart httpd(XAMPP 不走 systemd) - CentOS/RHEL 系统上,如果改完仍看到
shell_exec可用,先检查 SELinux 是否拦截:sudo setenforce 0临时关闭测试;确认是它导致后,用semanage放行 PHP 配置读取权限 - 改完后务必用代码验证:
<?php var_dump(function_exists('exec'));返回false才算成功
最常被忽略的是:禁用函数不能解决所有命令执行风险。比如通过 imagick、GD 或 FFmpeg 组件的漏洞,照样能触发系统命令。所以 disable_functions 是基础层防护,不是银弹;得配合 open_basedir、allow_url_include = Off 和最小权限运行 Apache 进程一起用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











