ThinkPHP 5.0.24 本身无上传漏洞,所谓“文件上传漏洞”实为开发者编写的上传逻辑存在校验缺陷;修复须强制重命名、finfo校验MIME、图片重绘、上传目录禁执行、关闭调试模式。

ThinkPHP 5.0.24 本身不内置上传组件,所谓“文件上传漏洞”实际是开发者在使用框架时编写的上传逻辑存在校验缺陷。修复重点不在升级框架补丁(该版本无官方上传CVE),而在于堵住业务层常见疏漏。核心思路是:拒绝不可信输入、验证真实内容、隔离执行环境。
强制重命名并规范后缀处理
上传文件名不能依赖 $_FILES['name'] 或 input('file.ext') 等用户可控字段截取后缀。
- 使用
uniqid() . mt_rand(1000,9999)生成唯一文件名 - 后缀必须白名单硬编码(如
'.jpg'),而非从原文件名中提取 - 过滤大小写(
.PHP)、多点(a.php.)、NTFS流(shell.php::$DATA)等绕过形式
用 finfo 真实校验文件类型
仅检查 $_FILES['type'] 或文件扩展名完全不可信。
- 调用
finfo_file(finfo_open(FILEINFO_MIME_TYPE), $tmp_file)获取真实 MIME - 白名单限定为
image/jpeg、image/png、image/gif等,拒绝text/plain、application/php - 若需支持图片马防护,后续必须重绘
图片类文件必须重绘再保存getimagesize() 和 exif_imagetype() 只读头部,无法识别图片末尾嵌入的 PHP 代码。
- 使用
imagecreatefromjpeg()/imagecreatefrompng()加载原图 - 用
imagejpeg()/imagepng()重新输出,丢弃原始文件所有元数据和尾部数据 - 保存新生成的二进制流,而非原始
$tmp_file
上传目录严格禁执行 + 配置加固
即使上传了恶意文件,也要确保无法被解析执行。
- Apache 下,在上传目录放置
.htaccess:<Files "*"> SetHandler default-handler </Files> - Nginx 下,在对应 location 中添加
deny all;或fastcgi_param SCRIPT_FILENAME ""; - PHP 配置中关闭
allow_url_include,上传目录不启用.user.ini解析 - Runtime/Logs 目录权限设为
750,禁止 Web 用户直接访问日志路径



















