php 的 phpinfo() 函数在生产环境中必须禁用,否则会直接暴露服务器配置、php 版本、扩展列表、数据库连接信息、文件路径等大量敏感数据,为攻击者提供精准的攻击面;需三层设防:一、php.ini 中通过 disable_functions 禁用函数调用;二、expose_php = off 关闭 url 彩蛋;三、web 服务器层拦截 /phpinfo.php 等路径访问,并扫描清理残留文件验证效果。

PHP 的 phpinfo() 函数在生产环境中必须禁用,否则会直接暴露服务器配置、PHP 版本、扩展列表、数据库连接信息、文件路径等大量敏感数据,为攻击者提供精准的攻击面。
一、在 php.ini 中禁用函数调用
这是最基础的防护层,但仅阻止脚本中显式调用 phpinfo(),无法拦截 URL 彩蛋。
- 编辑
php.ini,找到disable_functions行(若被注释则取消) - 在已有函数后追加
phpinfo,多个函数用英文逗号分隔,例如:disable_functions = exec,passthru,shell_exec,system,phpinfo - 保存后重启 Web 服务:
systemctl restart nginx或systemctl restart apache2
二、关闭 expose_php 开关(关键一步)
PHP 默认开启 Easter Egg 彩蛋机制,即使删了文件、禁了函数,攻击者仍可通过类似 ?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000 的 URL 强制触发完整 phpinfo 页面。
- 在
php.ini中确认:expose_php = Off - 执行命令验证:
php -i | grep expose_php,输出必须为expose_php => Off - 该设置不可被
ini_set()覆盖,只能在主配置中硬性关闭
三、Web 服务器层拦截访问路径
防止误传、CI/CD 自动部署残留或开发人员临时上传的 phpinfo.php、info.php 等测试文件被直接访问。
-
Apache(写入 .htaccess 或虚拟主机配置):
<filesmatch>Require all denied</filesmatch> -
Nginx(写入
server块,且必须放在location ~ \.php$ { }之前):location ~* /(phpinfo|info|test|debug)\.php$ { deny all; } - 额外建议:禁止访问常见敏感后缀:
location ~ \.(env|ini|log|bak|dist|yml|yaml)$ { deny all; }
四、清理残留文件并验证效果
别只信“删了就安全”,必须主动扫描 + 手动探测双重验证。
- 用 find 扫描 Web 根目录:
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"(响应头中不应含Content-Type: text/html,页面不应输出 PHP 配置) - 同步检查
display_errors = Off和html_errors = Off,避免错误页间接泄露路径或版本线索
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











