当前位置:

首页 > 编程开发 > ThinkPHP如何防范文件包含漏洞【安全】

ThinkPHP如何防范文件包含漏洞【安全】

ThinkPHP 在路径处理上其实一直有个“默认不设防”的特点——input() 和 Request::param() 拿到的路径类参数(比如 file、view、template)都是原始字符串,不做任何过滤。如果你直接把这些字符串拼进 include、file_get_contents() 或

ThinkPHP 在路径处理上其实一直有个“默认不设防”的特点——input() 和 Request::param() 拿到的路径类参数(比如 file、view、template)都是原始字符串,不做任何过滤。如果你直接把这些字符串拼进 include、file_get_contents() 或 think\facade\View::fetch(),那就等于把服务器文件系统的访问权限拱手让给了攻击者。

那么问题来了:想防住路径遍历,到底该怎么操作?先看一个常见的误区。

为什么 basename() 单独用不安全

basename() 这个函数看起来很方便——它只取路径的最后一部分。但麻烦在于,它只做字符串截断,完全不关心编码、空字节、符号链接或协议伪路径。举个例子:

  • ../../../etc/passwd%00.jpg 经过 basename() 变成 passwd%00.jpg。如果你用 file_exists() 判断存在再拼路径,旧版 PHP 中 %00 会截断字符串,校验直接失效。
  • http://evil.com/shell.php 经过 basename() 仍然得到 shell.php,但 include() 会直接远程加载它。
  • .//./../config.php 这种多重斜杠+点号的组合,basename() 既不解析也不清理,原样保留。

所以,basename() 只能作为第一步——强制剥离路径结构,之后必须配合白名单字符过滤和 realpath() 校验才能生效。

realpath() + strpos() 是唯一可靠路径校验组合

有些开发者尝试用 str_replace(['..', './'], '', $input) 或正则表达式来删除点号,但这类做法 100% 会被绕过。真正可靠的办法是让 PHP 自己解析出真实绝对路径,然后确认它是否落在授权目录内。具体步骤很清晰:

  1. $root = realpath('./app/views'); — 必须先通过 realpath() 得到真实路径,并且末尾带上斜杠。
  2. $requested = realpath('./app/views/' . basename(urldecode($input))); — 顺序不能乱:先 urldecode() 解码,再 basename() 取文件名,最后 realpath() 得到绝对路径。
  3. if (false === $requested || 0 !== strpos($requested, $root . '/')) { abort(403, 'Invalid file path'); } — 如果 realpath() 返回 false(路径不存在)或结果不在授权目录下,直接终止请求。

这里有几个关键点需要注意:

  • $root 末尾必须加斜杠,否则像 /app/views2/xxx 这样的路径会被误判为合法。
  • realpath() 对于不存在的路径返回 false,不能简单地当成“文件不存在”放过——必须统一拦截,因为可能是恶意构造的路径。
  • 别用 str_starts_with(),PHP 8.0+ 才支持,老环境直接报错。用 strpos() 或 substr() 更稳妥。
  • 如果用了 View::fetch() 并传入用户参数,必须先走这套校验,不能直接透传。

上传和下载场景必须切断路径拼接

上传时 $_FILES['file']['name'] 和下载接口的 filename 参数,是路径遍历攻击的高发区。永远不要直接把它们拼进路径里:

  • 不要写 file_get_contents('./uploads/' . $_GET['filename']),这种代码一写就炸。
  • 不要用 header('Content-Disposition: attachment; filename="' . $_GET['filename'] . '"') 直接输出用户输入,因为文件名里可能包含路径分隔符。
  • 下载接口应该只允许预设的 ID(如 download?id=123),通过查数据库映射到内部安全路径。
  • 上传的文件名必须重命名(如 UUID + 时间戳),原始的 name 字段仅作展示,绝不能参与路径构造。

说到底,写对几行校验代码并不难,真正难的是确保所有路径类入口——模板渲染、多语言加载、插件配置读取、日志导出——都经过同一套校验逻辑。漏掉一个 Lang::load() 或 Config::load() 的调用点,就等于在防火墙上凿了个洞。

ThinkPHP如何防范文件包含漏洞【安全】

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发 PHP
相关文章 更多
codex安装windows 命令行完整操作教程
codex安装windows 命令行完整操作教程

详解Windows环境下安装OpenAI Codex CLI的步骤,包括WSL环境检查、Node.js/npm配置、npm全局安装命令及首次启动验证,适合开发者快速上手。

NativeRest环境配置要求与完整操作教程
NativeRest环境配置要求与完整操作教程

学习如何配置 NativeRest REST API 客户端。涵盖 Windows/macOS/Linux 安装后的工作区创建、环境变量管理、请求编辑及响应查看步骤,帮助开发者快速完成基础环境搭建与连通性测试。

CSS设置透明度的注意事项有哪些?opacity属性详解
CSS设置透明度的注意事项有哪些?opacity属性详解

深入解析CSS中设置透明度的核心属性opacity,剖析子元素继承、事件穿透、层叠上下文等关键注意事项,并提供与rgba、hsla的实用选型对比。

flutter页面传值到后台的方法及示例代码
flutter页面传值到后台的方法及示例代码

flutter页面传值到后台的完整实现方法及示例代码,帮助读者快速掌握相关技术要点。

Java 8至21新特性代码写法对比:Lambda、Record与Switch
Java 8至21新特性代码写法对比:Lambda、Record与Switch

本文通过具体的旧版与新版代码对比,详细剖析Java 8引入的Lambda表达式、Java 14/16引入的Record类,以及Java 12至21逐步演进完善的Switch表达式与模式匹配,展示代码简化路径与避坑要点。

AI智能体开发培训课程学什么及实战内容介绍
AI智能体开发培训课程学什么及实战内容介绍

系统梳理AI智能体开发培训的核心知识模块、技术栈选型与典型实战项目,解析低代码平台与纯代码框架的差异,提供从零构建可落地智能体的完整学习与实施路径。

Java子类未实现抽象方法编译错误修复指南
Java子类未实现抽象方法编译错误修复指南

针对Java开发中常见的“子类未实现抽象方法”编译错误,深入分析报错原因,提供重写实现、声明抽象子类两种标准修复路径,并总结参数签名、访问修饰符等典型避坑要点。

解决PHP递归报错:max_nesting_level限制与内存溢出处理
解决PHP递归报错:max_nesting_level限制与内存溢出处理

遇到PHP递归报错时,不要盲目调大max_nesting_level。本文教你区分Xdebug限制、内存耗尽和正则递归错误,提供代码级的终止条件优化与迭代替代方案,彻底解决栈溢出问题。

PHP递归中static变量与引用传递的常见陷阱及调试
PHP递归中static变量与引用传递的常见陷阱及调试

本文分析PHP递归中static变量导致的状态污染及引用传递引发的共享数据修改问题。提供具体的代码复现、缓存键设计建议及调试打印技巧,帮助开发者避免隐蔽的逻辑错误。

PHP递归性能优化技巧与迭代替代方案
PHP递归性能优化技巧与迭代替代方案

解析PHP递归函数在树形数据处理中的性能瓶颈,提供预加载数据消除I/O、使用显式栈替代深层递归的实战方案,帮助开发者在代码可读性与执行效率间做出合理取舍。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

WINDOWS 更多
3dmax(3ds max)
3dmax(3ds max)
Windows

Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。