直接暴露phpinfo()页面等于将服务器“体检报告”贴在门口,会泄露PHP版本、扩展、环境变量、配置路径等攻击线索;应删除相关文件、Web服务器拦截请求、加IP或密钥访问控制、输出缓冲过滤敏感字段,并通过disable_functions禁用函数及expose_php=Off隐藏版本头。

直接暴露 phpinfo() 页面等于把服务器的“体检报告”贴在门口。它会显示 PHP 版本、已加载扩展、$_SERVER 环境变量、配置路径(如 DOCUMENT_ROOT)、数据库相关模块版本等——这些全是攻击者构造漏洞的线索。隐藏不是“让它看不见”,而是不让敏感内容生成或传递出去。
删文件 + 拦请求:最彻底的防线
生产环境不该存在 `phpinfo.php` 这类文件。
- 用 SSH 或 FTP 全站搜索:
phpinfo.php、info.php、test.php、debug.php,确认无业务依赖后直接删除 - Apache 下,在 `.htaccess` 或虚拟主机配置中加:
<Files "phpinfo.php"><br> Require all denied<br></Files>
- Nginx 下,在 server 块中加:
location ~* ^/(phpinfo|info|test|debug)\.php$ {<br> return 403;<br>}
加访问控制:只给可信人看
如果调试必须保留,就锁住入口。
- 只允许本地访问:
if ($_SERVER['REMOTE_ADDR'] !== '127.0.0.1' && $_SERVER['REMOTE_ADDR'] !== '::1') die('Access denied'); - 或加密钥验证:
if (!isset($_GET['key']) || $_GET['key'] !== 'aB3xK9') die('Unauthorized');,访问时带?key=aB3xK9 - 避免硬编码密钥,可从环境变量读取:
getenv('PHPINFO_KEY')
过滤输出:保留功能但削掉敏感字段
适用于不能删文件的探针类工具(如雅黑探针),核心是捕获再清洗。
立即学习“PHP免费学习笔记(深入)”;
- 用
ob_start()捕获输出,再正则剔除关键行:ob_start();<br>phpinfo();<br>$html = ob_get_clean();<br>$html = preg_replace('/<tr>.*?DOCUMENT_ROOT.*?<\/tr>/i', '', $html);<br>$html = preg_replace('/<tr>.*?SCRIPT_FILENAME.*?<\/tr>/i', '', $html);<br>$html = preg_replace('/<tr>.*?SERVER_ADDR.*?<\/tr>/i', '', $html);<br>$html = preg_replace('/<tr>.*?HTTP_HOST.*?<\/tr>/i', '', $html);<br>echo $html; - 重点过滤:
DOCUMENT_ROOT、SCRIPT_FILENAME、SERVER_ADDR、HTTP_HOST、PATH_TRANSLATED - 别碰
PHP Version或Loaded Extensions——探针靠它们判断环境
关掉源头:禁用函数 + 隐藏版本头
釜底抽薪,让 `phpinfo()` 根本调不动。
- 在
php.ini中加入:disable_functions = phpinfo,重启 PHP 服务生效 - 同时设:
expose_php = Off,防止响应头泄露X-Powered-By: PHP/8.3.5 - Apache 加:
ServerTokens Prod和ServerSignature Off - Nginx 加:
server_tokens off; - 再用
curl -I yoursite.com检查响应头,确认没有X-Powered-By和冗余 Server 字段



















