必须禁用 phpinfo() 函数而非仅屏蔽 URL,因动态调用、共享主机限制及 eval 等绕过手段使 Web 层拦截不可靠;推荐修改 php.ini 的 disable_functions,次选运行时重定义函数。

直接暴露 phpinfo() 页面是高危行为,等同于向攻击者主动递交服务器配置、扩展、路径、环境变量等敏感信息。生产环境必须禁止未授权访问。
为什么不能简单用 .htaccess 或 Nginx location 屏蔽整个 phpinfo.php?
因为很多老项目或 CMS(如某些 WordPress 插件、自定义调试页)会动态生成或包含 phpinfo() 调用,单纯删文件或拦截 URL 可能导致功能异常;更稳妥的方式是控制函数本身的行为,而非只堵入口。
- 仅靠 Web 服务器规则无法阻止通过
eval()、include()或反序列化触发的phpinfo()调用 - 部分共享主机不支持修改
.htaccess或 Nginx 配置 - 开发/测试环境仍需临时启用,硬屏蔽缺乏灵活性
禁用 phpinfo() 函数的两种可靠方式
优先在 PHP 运行时层面禁用,比 Web 层拦截更彻底。注意:禁用后任何调用都会报 Call to undefined function phpinfo() 错误,需提前确认无强依赖。
-
方式一(推荐):修改
php.ini在disable_functions中追加phpinfo(注意不带括号):disable_functions = exec,passthru,shell_exec,system,phpinfo
修改后必须重启 PHP-FPM 或 Web 服务器生效 -
方式二:运行时动态禁用(适合容器或 PaaS)
在入口文件(如
index.php)顶部加入:if (function_exists('phpinfo')) { unset($GLOBALS['phpinfo']); function phpinfo() { return false; } }⚠️ 此方法对已加载的扩展(如某些 Zend 扩展)可能无效,且无法覆盖eval("phpinfo();")
如果必须保留 phpinfo(),如何最小化暴露风险?
仅限内网调试或严格鉴权场景。核心原则:不暴露、不缓存、不索引、带时效。
立即学习“PHP免费学习笔记(深入)”;
- 将
phpinfo.php放在 Web 根目录外(如/var/www/private/phpinfo.php),再通过带鉴权的代理路由访问 - 添加 IP 白名单和登录验证:
- 访问后自动删除或重命名该文件(脚本化处理,避免遗忘)
最常被忽略的一点:CI/CD 流水线或 Docker 构建过程中,开发者可能无意把含 phpinfo() 的调试文件提交进仓库或镜像——建议在 .gitignore 加入 *phpinfo*.php,并在镜像构建阶段用 find /var/www -name "*phpinfo*" -delete 清理。











