PHP文件包含漏洞信息泄露的核心是用户可控参数绕过限制读取敏感文件,防御关键在于切断“输入→路径→读取”链条:实施白名单校验、禁用allow_url_include、敏感文件移出Web根目录、关闭错误显示并审计日志。

PHP文件包含漏洞引发的信息泄露,核心在于攻击者通过可控参数(如 $_GET['file'])绕过限制,读取服务器上的敏感文件(如 /etc/passwd、config.php、日志文件等)。解决的关键不是“堵住某一种payload”,而是切断“用户输入 → 文件路径 → 任意读取”的链条。下面从最直接有效的角度给出可落地的方案。
严格校验并限定包含路径范围
动态包含的本质风险在于路径不受控。必须放弃“过滤危险字符”这类被动思路,转为白名单或路径锁定:
- 只允许包含固定目录下的文件,例如
./includes/,并在代码中拼接时强制加前缀:include('./includes/' . $safe_file . '.php'); - 若需支持多个合法文件,用硬编码白名单比正则更可靠:
$allowed = ['header', 'footer', 'sidebar']; if (in_array($_GET['page'], $allowed)) { include("./templates/{$_GET['page']}.php"); } - 禁止使用
../、./、://等路径操作符,可用realpath()+ 目录前缀比对验证:$real = realpath($user_path); if (strpos($real, '/var/www/html/includes') !== 0) die('Access denied');
关闭远程包含与危险配置
RFI(远程文件包含)一旦触发,往往直接导致远程代码执行。即使当前没被利用,也必须提前禁用:
- 在
php.ini中设置:allow_url_include = Off和allow_url_fopen = Off(后者影响部分功能,但RFI防护优先级更高) - 确认 Web 服务器(Nginx/Apache)未在虚拟主机配置中意外开启这些选项
- 若使用共享主机无法改
php.ini,可在入口脚本开头用ini_set('allow_url_include', '0');尝试覆盖(部分托管环境支持)
剥离敏感文件的可访问性
很多信息泄露不是因为漏洞本身多强,而是敏感文件本就不该放在 Web 可达路径下:
立即学习“PHP免费学习笔记(深入)”;
- 数据库配置、密钥文件等,一律移出 Web 根目录,例如放到
/home/user/private/config.php,再用绝对路径包含 - 在 Web 服务器配置中屏蔽常见敏感路径:
location ~ /\.(env|git|log|bak|swp|yml|yaml)$ { deny all; }(Nginx) - 删除所有备份文件(
.php.bak、~、.swp)、示例文件(phpinfo.php、test.php)和调试接口
启用错误抑制与日志审计
即便漏洞存在,也不应让错误信息成为攻击者的侦察工具:
- 生产环境必须关闭错误显示:
display_errors = Off,同时开启错误日志:log_errors = On,并定期检查日志中是否出现异常的include警告 - 在包含逻辑前后添加简单审计点,例如记录可疑参数:
if (preg_match('/\.\.\/|php:\/\/|data:/', $_GET['file'])) error_log("LFI attempt: " . $_GET['file'], 3, "/var/log/lfi-attempts.log"); - 配合 Web 应用防火墙(WAF)规则,拦截含
%00、.../、etc/passwd等特征的请求



















