

新闻资讯
技术教程phpinfo() 在生产环境硬编码调用属高危操作,会暴露PHP配置、扩展、环境变量及敏感路径;临时使用须限内网、加访问控制并立即删除;推荐用位掩码限制输出或改用 ini_get_all() 等安全替代方案。
phpinfo() 会暴露敏感信息,不建议上线使用生产环境里硬编码 phpinfo() 是高危操作:它默认输出全部 PHP 配置、扩展、环境变量、$_SERVER 内容,包括 DOCUMENT_ROOT、SCRIPT_FILENAME、甚至数据库连接字符串(如果被错误地泄露到 php.ini 或环境变量中)。很多 CMS 和框架的「调试页面」被黑,源头就是残留的 phpinfo() 调用。
如果只是临时排查,必须满足三个条件:
— 仅限本地或内网访问
— 加访问控制(如 IP 白名单或简单密码)
— 用完立即删除
phpinfo() 支持整数参数,控制输出哪些模块。比如只看扩展和版本,避免泄露路径和环境:
if (isset($_GET['debug']) && $_GET['debug'] === 'safe') {
// 只显示 PHP 版本、编译选项、加载的扩展(不含配置值)
phpinfo(INFO_GENERAL | INFO_M
ODULES);
}
常见位掩码组合:
INFO_GENERAL:PHP 版本、服务器信息、编译参数INFO_CONFIGURATION:php.ini 路径和所有配置项(慎用)INFO_MODULES:已加载的扩展名列表(无详细配置)INFO_VARIABLES:$_ENV、$_SERVER 等(极度危险,禁用)不要写 phpinfo(0) 或 phpinfo(-1) —— 这等价于全量输出,风险最大。
ini_get_all() 和 get_loaded_extensions() 拼装轻量信息真正需要查配置时,不如主动取你需要的几项,可控、可过滤、不依赖 phpinfo() 渲染逻辑:
$safe_info = [
'php_version' => PHP_VERSION,
'sapi' => PHP_SAPI,
'extensions' => get_loaded_extensions(),
'upload_max' => ini_get('upload_max_filesize'),
'post_max' => ini_get('post_max_size'),
'memory_limit'=> ini_get('memory_limit'),
];
echo '' . htmlspecialchars(print_r($safe_info, true)) . '
';
好处:
php.ini 实际路径mysql.default_password)output_buffering 或 zlib.output_compression 导致输出截断phpinfo() 却看不到输出CLI SAPI 下 phpinfo() 默认输出纯文本格式,但某些终端或 IDE 的输出捕获机制会把它当 HTML 解析,导致乱码或空白。解决方法:
ob_start() + ob_get_clean() 捕获后手动处理phpinfo(INFO_GENERAL | INFO_MODULES);(CLI 下自动为文本)php -v、php -m、php --ini 命令行查另外注意:如果脚本用了 exit 或 die 在 phpinfo() 前,它根本不会执行;如果开启了 disable_functions 且含 phpinfo,调用会静默失败并返回 false。
真正要查问题时,别迷信 phpinfo() 的「全」,盯住你怀疑的那几个配置项,用 ini_get() 或 extension_loaded() 直接验证,反而更快更准。