PHP 8.3 关闭 phpinfo() 需三层设防:一、php.ini 中 disable_functions 禁用函数调用;二、expose_php = Off 关闭 URL 彩蛋;三、Web 服务器层拦截敏感路径;最后须扫描残留并验证响应。

PHP 8.3 中关闭 phpinfo() 不是“关一个函数”那么简单,而是要三层设防:PHP 解析层禁用调用、Web 服务器层拦截访问、运行时机制阻断彩蛋式触发。漏掉任何一层,都可能被绕过。
一、在 php.ini 中彻底禁用函数调用
这是最基础但非万能的一环。修改生产环境的 php.ini:
- 找到
disable_functions行,取消注释(若被注释) - 追加
phpinfo,多个函数用英文逗号分隔,例如:disable_functions = exec,passthru,shell_exec,system,phpinfo - 保存后重启 Web 服务(
systemctl restart nginx或systemctl restart apache2)
⚠️ 注意:该设置仅阻止脚本中显式调用 phpinfo(),对 ?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000 这类 URL 彩蛋无效。
二、必须关闭 expose_php 开关
这是最容易被忽略却最关键的一步。PHP 默认开启此彩蛋机制,即使删了文件、禁了函数,攻击者仍可通过任意 PHP 页面加特殊参数强制输出完整 phpinfo 页面。
立即学习“PHP免费学习笔记(深入)”;
- 在
php.ini中确认:expose_php = Off - 执行命令验证:
php -i | grep expose_php,输出必须为expose_php => Off - 该配置不依赖
disable_functions,也不受ini_set()影响,只能在 php.ini 或主配置中硬性关闭
三、Web 服务器层做兜底拦截
防止误传、CI/CD 自动复制、或开发人员临时上传测试文件。规则必须放在主 PHP 处理逻辑之前,否则会被覆盖。
-
Apache(写入
.htaccess或虚拟主机配置):<FilesMatch "(phpinfo|info|test|debug)\.php$"><br> Require all denied<br></FilesMatch>
-
Nginx(写入
server块,且必须在location ~ \.php$ { ... }之前):location ~* /(phpinfo|info|test|debug)\.php$ {<br> deny all;<br>} - 额外建议:禁止访问常见敏感后缀,如
.env、.ini、.log:location ~ \.(env|ini|log|bak|dist|yml|yaml)$ { deny all; }
四、清理与验证缺一不可
别只信“删了就安全”。要动手验证是否真生效:
- 用
find扫描残留文件:find /var/www -name "*phpinfo*" -o -name "info.php" -o -name "test.php" 2>/dev/null - 手动探测两个关键路径:
curl -I http://yoursite.com/phpinfo.php(应返回 403/404)curl -I http://yoursite.com/?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000(也应返回 403/404) - 检查 Web 服务器 access log,确认上述请求未产生 200 响应
不复杂但容易忽略



















