php文件包含漏洞本质是“可控路径 + 无校验”,防御核心是切断用户输入到文件执行的链路,需通过固定映射表、白名单校验、禁用危险配置与伪协议、关闭allow_url_include、重构逻辑及最小化函数权限等多层措施实现。

PHP文件包含漏洞本质是“可控路径 + 无校验”,即用户输入直接拼入 include、require 等函数,导致服务器加载并执行非预期文件。防御关键不在堵某一种利用方式,而在于切断“用户控制→文件执行”这条链路。
本地文件包含(LFI)的防御要点
LFI最常见也最危险,攻击者常读取 /etc/passwd、Web日志、Session文件,甚至结合上传或日志投毒实现代码执行。防御需多层设防:
-
禁用动态拼接路径:避免
include($_GET['file'] . '.php')这类写法。必须动态加载时,改用固定映射表,例如:$pages = ['home' => 'home.php', 'about' => 'about.php'];<br>if (isset($pages[$_GET['page']])) { include($pages[$_GET['page']]); } -
白名单校验 + 目录锁定:若参数需对应真实文件名,只允许字母、数字、下划线,且强制限定在指定子目录内。可用
basename()去掉路径干扰,再拼接绝对路径:$safe_file = basename($_GET['f']);<br>include('/var/www/app/includes/' . $safe_file . '.inc'); -
关闭危险配置:确保 php.ini 中
allow_url_fopen = Off(虽主要防RFI,但也能阻断部分LFI绕过)、open_basedir设为应用根目录,限制脚本只能访问授权路径。 -
禁用高危伪协议:如非必要,禁用
php://filter、data://、phar://等流包装器,可通过disable_functions配置项限制。
远程文件包含(RFI)的防御要点
RFI依赖 allow_url_include = On,PHP 5.2+ 默认关闭,现网极少遇到,但老旧系统仍需警惕。防御重点是“默认关闭 + 显式拒绝”:
-
php.ini 强制关闭核心开关:确认以下两项均为
Off:allow_url_fopen = Off<br>allow_url_include = Off
重启PHP服务后生效,这是阻断RFI最根本的措施。 -
不信任任何外部URL参数:即使业务真需加载远程资源(如CDN配置),也不应使用
include(),而改用file_get_contents()+eval()(极不推荐)或更安全的解析逻辑(如JSON配置+白名单字段校验)。 -
Web服务器层拦截:在Nginx/Apache配置中,对含
http://、https://、ftp://的file、page类参数直接返回403,从入口过滤可疑值。
通用加固建议
无论LFI还是RFI,底层都是输入未过滤、函数权限过大。真正有效的防御是收敛能力、明确边界:
-
重构代码逻辑:用自动加载(
spl_autoload_register)替代手动include;用配置中心或数据库管理动态内容,而非文件路径传参。 -
最小化函数权限:生产环境禁用
eval、assert、create_function等动态执行函数,降低LFI被链式利用的风险。 -
日志与监控:记录所有包含操作的参数和来源IP,对高频访问敏感路径(如
../../../../、php://)行为告警。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











