Laravel 9.x 本身不引入文件包含漏洞,但开发者若不当使用 PHP 原生 include/require 等函数并直接传入未校验的用户输入(如 $_GET['page']),将导致本地文件包含(LFI)风险;修复核心是杜绝用户输入直连文件路径,统一采用 Laravel 内置机制(如 view()、config()、__()),确需动态加载时须严格白名单映射、路径规范化与 php.ini 安全配置(allow_url_include=Off 等)。

Laravel 9.x 本身不直接引入文件包含漏洞,但开发者若在代码中**不当使用 PHP 原生文件包含函数**(如 include、require、include_once、require_once),并把用户可控参数(如 $_GET['page'])未经校验直接传入,就会触发本地文件包含(LFI)风险。修复核心不是“给 Laravel 打补丁”,而是切断用户输入与文件路径解析的直连关系。
严格禁止动态包含用户输入
这是最根本的防线。Laravel 的 Blade 模板、路由、服务容器等机制已提供安全替代方案,无需手写 include()。
- 删除所有形如
include($_GET['file']);或require($request->input('template'));的代码 - 模板渲染统一走
view('home.index'),而非拼接路径后include - 配置加载、语言包、静态资源等,全部使用 Laravel 内置机制(
config()、__()、asset()),不手动file_get_contents()或include文件路径
若业务确需动态加载文件,必须用白名单映射
绝不允许用户输入决定完整路径或任意后缀。只接受预定义键名,再由代码映射到固定安全路径。
- 例如支持几种报告模板:
report_type=pdf、report_type=csv,后端硬编码映射:$map = ['pdf' => 'reports/generate_pdf.php', 'csv' => 'reports/generate_csv.php']; - 对输入先做
in_array($type, array_keys($map))校验,不匹配则拒绝 - 映射值必须是相对项目根目录的固定路径,且不含
../、phar://、php://等危险协议
路径规范化与输入过滤双保险
即使做了白名单,也要防止绕过(如大小写、URL 编码、空字节等)。Laravel 提供了现成工具:
- 使用
basename()提取文件名,剥离路径部分:$safeName = basename($request->input('file')); - 结合
Str::of($safeName)->replace(['..', '%2e', "\x00"])->toString()清理常见绕过字符 - 最终拼接路径时,用
app_path('allowed_dir/') . $safeName显式限定根目录,避免脱离应用范围
关闭危险 PHP 配置,堵住协议利用入口
很多 LFI 进阶利用(如 php://filter、data://、日志注入)依赖 PHP 配置。生产环境必须收紧:
- 确保
allow_url_include = Off(禁用远程包含 RFI) - 确认
allow_url_fopen = Off(限制远程流,降低伪协议危害) - 检查
open_basedir是否设为项目根目录,限制文件操作范围 - 这些配置在
php.ini中设置,不可仅靠 Laravel 层面控制


















