thinkphp8.0.0本身无上传漏洞,但开发者易因沿用旧习惯在业务层写出可绕过逻辑;须聚焦校验可信性、命名可控性、存储隔离性、执行受限性四环节,严查mime校验、扩展名清洗、强制重命名、路径与解析权限分离。

ThinkPHP8.0.0 本身不带上传漏洞,但开发者若沿用旧习惯或忽略框架变化,极易在业务层写出可被绕过的上传逻辑。代码审计时不能只看“有没有用 TP 的 Upload 类”,而要聚焦「校验是否可信、命名是否可控、存储是否隔离、执行是否受限」四个关键环节。
检查上传类是否开启多重校验
TP8 的 think\File 或 think\facade\Filesystem 默认不自动做 MIME 或内容校验。需确认代码中是否显式配置了:
-
后缀白名单:检查
exts参数是否为明确数组(如['jpg','png','pdf']),而非空值、['*']或仅靠前端传参动态生成 -
MIME 白名单:是否设置了
mimes(如['image/jpeg', 'application/pdf']),且未仅依赖$_FILES['type'] -
强制重命名:确认
auto_rename为true,且未被覆盖为false;同时检查saveName是否用了闭包——若仍用已废弃的数组写法(如['uniqid', '']),实际会失效
检查文件名处理是否存在清洗缺陷
TP8 的 getOriginalName() 直接返回原始字符串,攻击者可构造 shell.PHP、a.php.、1.jpg::$DATA 等畸形文件名。审计时重点看:
- 是否对扩展名使用
pathinfo($name, PATHINFO_EXTENSION)提取?该方式易被多点、空格、大小写绕过 - 是否统一转小写后再比对白名单?是否过滤了
%00、Unicode 零宽字符等截断/混淆符号? - 是否禁用所有 PHP 变体后缀(
php3、phtml、phar、htaccess、inc)及其大小写变形?
检查上传路径与服务器执行权限是否分离
即使文件名和类型都安全,若上传目录在 Web 根目录下且允许解析 PHP,就等于给攻击者留了后门入口。审计需确认:
- 上传目标路径是否硬编码为
public/uploads/等 Web 可访问目录?理想位置应是runtime/upload/或 Web 根目录之外(如/data/uploads/) - 是否在 Nginx/Apache 配置中限制上传目录的脚本执行?例如 Nginx 中是否有
location ~ ^/uploads/.*\.php$ { return 403; } - 是否关闭调试模式(
APP_DEBUG=false)?开启状态下,失败上传的日志可能泄露临时文件路径或原始恶意文件名
检查是否遗漏二次校验与内容验证
仅靠扩展名和 MIME 不足以防御图片马或 .htaccess 利用。必须检查业务代码中是否补充了:
- 调用
finfo_file()对$_FILES['file']['tmp_name']做真实 MIME 校验,而非仅读$_FILES['type'] - 对图片类上传,是否用
exif_imagetype()或 GD 库重绘(如imagejpeg(imagecreatefromjpeg($tmp), $dst))来剥离隐藏代码? - 是否禁止上传
.htaccess、.user.ini等配置文件?这类文件虽非脚本,却可触发 Apache/PHP 的二次解析机制
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











