PHP 安全科普 · 防御向
phpinfo() 暴露:为什么重要,怎么修
phpinfo() 会打印完整的 PHP 配置。搭服务器时很方便,忘在线上就成了送给攻击者的礼物。
最近更新
这是什么
PHP 手册说明 phpinfo() 会输出大量关于 PHP 当前状态的信息,包括编译选项、扩展、PHP 版本、服务器信息、环境变量和 HTTP 头。在线上网站上,这可能包括数据库主机名、存放在环境变量里的 API 密钥和内部路径。MITRE 把这种情况归为 CWE-200(敏感信息暴露)。
怎么发现
- 在网站根目录搜索调用
phpinfo(的文件,以及info.php、phpinfo.php、test.php这类文件名。 - 在你自己的网站上请求这些文件名,看是否返回 200。不要扫描不属于你的网站。
- 检查
X-Powered-By响应头是否显示 PHP 版本,这由expose_php控制。
怎么修
- 从生产环境删除 phpinfo 文件。需要这些信息时,在服务器上运行
php -i,或者把临时页面放在认证之后,用完就删。 - 如果没有应用需要它,在 php.ini 的
disable_functions里加上phpinfo。 - 设置
expose_php = Off,从响应头里去掉版本号。 - 凡是在暴露的 phpinfo 页面上出现过的密钥都要更换,因为你无法知道谁看过。
只读检查与安全写法
# Find leftover phpinfo() files (read-only)
grep -rln "phpinfo\s*(" --include=*.php /var/www 2>/dev/null | grep -v /vendor/
# Check your own site for common file names (only on hosts you own)
for f in phpinfo.php info.php test.php i.php; do
curl -s -o /dev/null -w "%{http_code} $f\n" "https://your-site.example/$f"
done
; php.ini: stop advertising the version and block the function
expose_php = Off
disable_functions = phpinfo显示 PHP 版本真的有问题吗?
单独来看不算漏洞,但它会告诉攻击者服务器是否还低于 8.2.35、8.3.36、8.4.27 或 8.5.12。去掉它没有任何成本。
主机控制面板里能看到 phpinfo,算暴露吗?
如果在面板登录之后就不算。风险在于无需认证就能访问的 phpinfo 页面。
其他常见 PHP 漏洞类型
- PHP 对象注入:是什么,怎么修当用户可控的输入进入 unserialize() 时就会发生 PHP 对象注入,它可以实例化对象,并通过魔术方法执行攻击者选定的逻辑。
- PHP 文件包含(LFI/RFI):是什么,怎么修当用户输入控制了 include 或 require 的路径时就会发生文件包含,攻击者可以读取本地文件(LFI),在开启 allow_url_include 时还能运行远程代码(RFI)。
- PHP 中的 SSRF:是什么,怎么修当 PHP 应用请求一个由用户控制的 URL 时就会发生服务端请求伪造(SSRF),攻击者可以借你的服务器访问内网服务或云元数据接口。
- PHP 中的 XSS:是什么,怎么防当 PHP 页面把用户可控的数据不经转义输出到 HTML 时就会发生跨站脚本(XSS),攻击者的脚本会在其他访客的浏览器里运行。
来源
出站链接将离开本站。本站不托管利用代码。
- phpinfo() — PHP Manual
- Core php.ini directives (open_basedir, expose_php) — PHP Manual
- CWE-200: Exposure of Sensitive Information to an Unauthorized Actor — MITRE CWE