禁用高危函数并限制执行范围是最有效方式:在php.ini中配置disable_functions和open_basedir,重启服务后验证生效,同时需代码层加固与权限最小化。

直接禁用高危函数并限制执行范围,是降低 PHP 8.1.23 命令执行漏洞风险最有效的方式。该版本虽已修复部分 CVE(如 CVE-2024-4577),但若代码层仍调用危险函数拼接用户输入,仍可能触发操作系统命令注入。
禁用危险函数(核心措施)
打开 php.ini 文件(常见路径:/etc/php/8.1/apache2/php.ini 或 /usr/local/php/etc/php.ini),定位或添加 disable_functions 配置项:
- 取消注释(去掉开头的分号),确保该行生效
- 填入以下函数列表(英文逗号分隔,无空格):
exec,passthru,shell_exec,system,proc_open,popen,eval,assert,symlink,link,chmod,chown,chgrp,ini_set,dl - 特别注意:eval 和 assert 在 PHP 8.1+ 中仍可被用于动态代码执行,必须禁用
- 保存后重启 Web 服务(sudo systemctl restart apache2 或 sudo systemctl restart php8.1-fpm nginx)
限制脚本可访问文件范围
即使函数被禁,攻击者仍可能通过路径遍历读取敏感文件。启用 open_basedir 可强制限定 PHP 的文件操作边界:
- 在 php.ini 中设置:
open_basedir = /var/www/html:/tmp:/var/log/php - 多个目录用冒号(Linux/macOS)或分号(Windows)分隔
- 务必包含 /tmp,否则文件上传、会话存储等基础功能会失败
- 避免设为 / 或留空,那等于未启用
验证配置是否生效
修改后必须确认策略落地,不能仅依赖“保存即生效”假定:
- 终端执行:php -r "echo ini_get('disable_functions');",检查输出是否含你添加的函数
- 新建 test.php:
通过浏览器访问,应返回空白页或致命错误(而非显示 uid/gid) - 检查 open_basedir 是否启用:php -r "echo ini_get('open_basedir');"
补充建议(非 php.ini 但强相关)
php.ini 是基础防线,但无法替代代码层加固:
- 所有涉及系统命令的逻辑(如 ping、curl、convert),改用 PHP 原生函数(gethostbyaddr、file_get_contents、imagick)替代 shell 调用
- 用户输入参与命令构造时,必须白名单校验(如 IP 地址用 filter_var($ip, FILTER_VALIDATE_IP))
- Web 服务器用户(如 www-data)权限应最小化,禁止登录、无 shell、不属 sudo 组
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











