绝对路径本身不能防文件包含漏洞,关键在于路径是否可控、是否校验、是否限制范围;真正有效的是路径确定性+访问控制+输入隔离三者结合,需配合realpath校验、open_basedir限制及白名单映射等纵深防御措施。

用绝对路径本身不能防文件包含漏洞,关键在于路径是否可控、是否校验、是否限制范围。单纯把 include("header.php") 改成 include("/var/www/html/header.php"),如果这个路径仍由用户输入拼接而来,漏洞照旧存在。真正起作用的是“路径确定性 + 访问控制 + 输入隔离”三者结合。
明确应用根目录并统一使用绝对路径
在入口文件(如 index.php)中定义一个不可变的根路径常量,后续所有包含操作都基于它构建,避免相对路径被篡改利用:
- 用
__DIR__或dirname(__FILE__)获取当前文件所在绝对目录,再向上或向下拼出项目根目录 - 例如:
define('APP_ROOT', dirname(__DIR__));,之后所有include都写成include APP_ROOT . '/inc/config.php'; - 禁止在路径拼接中混入任何用户输入(如
$_GET、$_POST),哪怕只加一个点号都可能引入遍历风险
配合 realpath() 做路径真实性与范围校验
即使用了绝对路径拼接,攻击者仍可能通过 %00 截断、编码绕过或符号链接等方式干扰解析。必须用 realpath() 获取真实物理路径,并确认其落在预期目录内:
- 先拼出待包含路径,再调用
$realPath = realpath($path); - 检查
$realPath是否不为空,且以预设的APP_ROOT开头(用str_starts_with($realPath, APP_ROOT)) - 若校验失败,直接中止执行,不抛出具体错误信息(避免泄露路径结构)
禁用远程包含并限制本地访问范围
绝对路径只是起点,环境配置才是兜底防线:
- 在
php.ini中设置allow_url_include = Off,彻底关闭远程文件包含能力 - 启用
open_basedir,限定 PHP 进程只能访问指定目录树,例如:open_basedir = "/var/www/html:/tmp" - 确保 Web 服务器(如 Nginx/Apache)不将敏感目录(如
/etc、/var/log)映射为可访问路径
优先采用白名单机制替代路径拼接
最安全的方式不是“怎么拼得更牢”,而是“根本不拼”。业务上需要动态选择文件时,应放弃字符串拼接,改用预定义映射:
- 建立数组:
$pages = ['home' => '/inc/home.php', 'about' => '/inc/about.php']; - 接收参数后仅作为键查找:
$file = $pages[$_GET['p']] ?? null; - 若查不到或值为空,拒绝包含;查到则直接
include $file;,全程无路径构造
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











