必须关闭phpinfo()公开访问,因其暴露php配置、扩展、环境变量、服务器信息等敏感数据,攻击者可据此精准利用漏洞;需关闭expose_php、删除或重命名文件、配置web服务器拦截规则并验证生效。

生产环境必须关闭 phpinfo() 的公开访问,不是“建议”,而是基础安全红线。它一旦暴露,等于把服务器的身份证、体检报告、家庭住址、钥匙藏匿点全贴在门口。
为什么删不掉 phpinfo.php 还会泄露
很多人删了 phpinfo.php 就以为万事大吉,结果扫描仍能访问到 —— 常见原因有三个:
-
expose_php = On未关:PHP 自带“彩蛋”机制,访问任意 PHP 页面加?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000(或类似 UUID)就能强制触发phpinfo()输出,和脚本无关 - Web 服务器配置未覆盖:比如 Nginx 的
location ~ \.php$块里漏写了拦截规则,或规则顺序错位,导致/test.php这类文件绕过限制直接执行 - CI/CD 自动部署时重新上传了测试文件:Git 忽略了
info.php,但构建脚本从模板目录复制过去,人工清理永远追不上自动化节奏
Apache 和 Nginx 禁用 phpinfo 的真实写法
光靠删文件不行,得在 Web 服务器层做“兜底拦截”。注意:规则必须放在主 PHP 处理块之前,否则无效。
Apache(写在 .htaccess 或虚拟主机配置中):
<filesmatch>
Require all denied
</filesmatch>
Nginx(写在 server 块内,且必须在 location ~ \.php$ { ... } 之前):
location ~* /(phpinfo|info|test)\.php$ {
deny all;
}
别信“用 php_flag disable_functions phpinfo 就行”——这个指令只影响 PHP 解析逻辑,对 expose_php 彩蛋完全无效,也拦不住已上传的脚本。
检查是否真生效的三个硬核动作
别只看页面打不开就放心,攻击者不会手动点链接,他们用脚本批量探测:
- 查
expose_php:运行php -i | grep expose_php,输出必须是expose_php => Off - 扫常见路径:用
curl -s -o /dev/null -w "%{http_code}" http://yoursite.com/phpinfo.php和http://yoursite.com/?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000两个地址都测,状态码都应为403或404 - 翻日志确认没漏:临时把 Web 服务器 access log 级别调高,跑一遍探测请求,看有没有
200响应记录
最常被忽略的是 expose_php 这个开关 —— 它默认是 On,且不随 disable_functions 变化。哪怕你禁了所有函数,只要这个开着,彩蛋就一直有效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











