php 8.0 中 disable_functions 应精准禁用 exec、shell_exec、system、passthru、proc_open、popen、pcntl_exec、putenv、ini_set、curl_exec、file_get_contents 等高危函数,避免误禁 assert、unserialize 等导致兼容性问题,并严格遵循全小写、逗号分隔无空格、不换行无注释的语法规范。

PHP 8.0 中 disable_functions 不是“越多越好”,而是要精准拦截真正可被利用的高危入口,同时避免破坏框架或扩展的正常运行。配置写错一个字符、多一个空格或换行,整行就会被 PHP 静默丢弃——结果是看似禁了十个函数,实际一个都没生效。
必须禁用的核心高危函数(PHP 8.0 实测有效)
这些函数在 WebShell、RCE 利用链中高频出现,且无合理业务场景需在 Web 环境开放:
- exec、shell_exec、system、passthru:直接执行系统命令,最常见攻击入口
- proc_open、popen:比 exec 更隐蔽,支持双向通信,AntSword/China Chopper 默认首选
- pcntl_exec:可绕过部分 disable_functions 检查机制,常被遗漏
- putenv、ini_set:不直接执行命令,但能修改环境变量或关键配置(如绕过 open_basedir),建议一并禁用
-
curl_exec、file_get_contents(配合
php://filter或 SSRF):可用于读取敏感文件(如/etc/passwd、源码),应纳入防护范围
PHP 8.0 中不必禁、甚至不该禁的函数
盲目禁用会引发兼容性问题,且无实质安全收益:
-
assert:PHP 7.2+ 已移除动态代码执行能力,新版更倾向用
eval替代;禁用可能导致 Laravel、Symfony 等框架断言失败 - unserialize:本身不危险,风险在于反序列化对象;禁用会导致 Composer 自动加载、缓存机制崩溃
- create_function:PHP 8.0 已彻底废弃,配置里写它毫无意义
-
eval:虽危险,但禁用后易被
preg_replace('/.*/e'(已移除)或动态调用绕过;更可靠的方式是结合opcache.enable=1和严格输入过滤
正确写法与生效验证要点
配置项极其脆弱,必须严格遵循语法规范:
- 函数名全小写:
shell_exec✅,SHELL_EXEC❌ - 逗号为唯一分隔符,前后禁止空格:
exec,system,passthru✅,exec, system❌ - 不能换行、不能加注释、末尾不能有逗号:
exec,system,❌(整行失效) - FPM 环境下,
www.conf中的php_admin_value[disable_functions]优先级高于 php.ini,必须同步检查 - 验证必须分环境:Web 端看
phpinfo()的 Loaded Configuration File 路径 + 输出字段;CLI 端用php -i | grep disable_functions;实测调用用php -r "var_dump(shell_exec('id'));"
推荐的一线可用配置(PHP 8.0)
复制粘贴前,请先确认你的 PHP 运行模式(FPM/Apache/CLI)和配置路径:
disable_functions = exec,shell_exec,system,passthru,proc_open,popen,pcntl_exec,putenv,ini_set,curl_exec,file_get_contentsphp免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











