讲师中心 微信公众号
AI工具推荐 视频效率加速

Echo框架怎么校验上传文件的真实后缀

夏丽姑娘_5098

夏丽姑娘_5098

发布时间:2026-10-23 09:13:35

|

648人浏览过

|

来源于php中文网

原创

应使用 finfo_open() + finfo_buffer() 校验文件真实 MIME 类型,结合映射表获取可信后缀,再用随机文件名保存;禁用 $_FILES'file' 和 path.Ext(),避免空字节与路径遍历风险。

echo框架怎么校验上传文件的真实后缀

用 finfo_open() 读文件头,别信 $_FILES['file']['type']

浏览器传来的 $_FILES['file']['type'] 是客户端自己填的,改个请求头就能变成 application/x-php,完全不可信。Echo 框架本身不内置 MIME 校验,得你自己在 FormFile 之后立刻用 PHP 的 finfo_open() 查真实类型。

关键点:必须基于临时文件路径(file.Open() 返回的 src 是 io.ReadSeeker,不能直接喂给 finfo_file();得先写到磁盘或用 finfo_buffer())。

推荐做法是:调用 file.Open() 后,用 io.Copy 把前几百字节读进内存 buffer,再用 finfo_buffer() 判断——既避开写磁盘开销,又绕过流不可 rewind 的问题。

in_array() 白名单校验必须配合真实后缀提取

只用 path.Ext(file.Filename) 提取后缀是危险的——攻击者传 shell.php.jpg,path.Ext() 返回 .jpg,但实际可能是 PHP 文件。正确做法是:先用 finfo_buffer() 得到真实 MIME,再映射成可信后缀(比如 image/jpeg → .jpg),最后用 in_array() 对照白名单数组比对。

常见错误:

  • 把白名单写成 ["jpg", "jpeg", "png"],但 finfo_buffer() 返回的是 image/jpg(不是标准 MIME),导致匹配失败
  • 没做大小写归一化,image/JPEG 和 image/jpeg 被当成两个类型
  • 用 strings.HasSuffix(file.Filename, ".pdf") 替代 MIME 校验,等于开门揖盗

为什么不用 mime_content_type()?它在 Echo 场景下容易失效

mime_content_type() 看起来更短,但它依赖临时文件路径,而 Echo 的 c.FormFile("xxx") 返回的 *multipart.FileHeader 只提供 Filename 和 Size,不保证 tmp_name 可用(尤其在自定义 MaxMemory 或启用了 SaveMultipartForm 时)。一旦 mime_content_type("/tmp/phpXXXXXX") 返回 false,你连 fallback 都没机会做。

Echo框架 5.1.0
Echo框架 5.1.0

Echo框架 5.1.0 版本源码包下载,适合关注 RealIP 行为变化、StartConfig.Listener、NewDefaultFS 和观测性中间件入口的开发团队。

下载

相比之下,finfo_open(FILEINFO_MIME_TYPE) + finfo_buffer($buf) 完全不依赖磁盘路径,只要读到前 256 字节就足够识别 PDF、PNG、JPEG、ZIP 等绝大多数格式。

示例关键片段:

file, _ := c.FormFile("document")
src, _ := file.Open()
defer src.Close()

buf := make([]byte, 256)
src.Read(buf) // 忽略 error,finfo_buffer 能处理不完整 buffer
f := finfo_open(FILEINFO_MIME_TYPE)
mimeType := finfo_buffer(f, buf)
finfo_close(f)

extMap := map[string]string{
    "application/pdf": ".pdf",
    "image/jpeg":      ".jpg",
    "image/png":       ".png",
}
realExt, ok := extMap[strings.ToLower(mimeType)]
if !ok {
    return c.JSON(http.StatusBadRequest, "invalid file type")
}

上传路径里别拼接原始 Filename,随机名 + 真实后缀才是安全组合

即使通过了 MIME 和白名单校验,也不能直接用 file.Filename 构造保存路径——攻击者可能在文件名里塞 ../../.htaccess 或空字节截断。Echo 不自动清理这些。

正确姿势是:

  • 生成随机前缀(如 uuid.New().String())
  • 拼上从 MIME 映射出的真实后缀(不是用户传的)
  • 用 os.Create(filepath.Join(uploadDir, safeName)) 写入

注意:不要用 path.Base(file.Filename) 做二次过滤——它对 foo%00bar.jpg 这类空字节无效,且不解决路径遍历问题。真实后缀必须来自 finfo_buffer() 结果,不是字符串拆分。

最易被忽略的一点:校验和重命名必须在同一个逻辑分支里完成。如果先校验、再另起一个函数保存,中间可能被并发请求篡改临时文件内容——虽然概率低,但在金融或政务系统里,这属于必须堵死的缝隙。

热门AI工具

更多
超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

相关专题

更多
Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

0

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

0

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

0

2026.10.22

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

0

2026.10.22

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

0

2026.10.22

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

0

2026.10.22

PHP2Shell高危漏洞修复教程
PHP2Shell高危漏洞修复教程

PHP2Shell漏洞是什么,哪些PHP版本和运行环境会受到影响,服务器应该如何检测与修复?本专题提供版本自查脚本、Linux与Docker升级命令、PHP-FPM和Apache排查步骤,以及修复验证、临时缓解和应急响应方案。

40

2026.10.22

剧云人物设定与关系管理教程
剧云人物设定与关系管理教程

本专题介绍剧云人物设定与关系管理,讲解角色小传、性格职业、人物目标、背景资料和关系网络的创建及维护方法。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Echo框架IP地址文档
Echo框架IP地址文档

共0课时 | 0人学习

Echo框架中文安装文档
Echo框架中文安装文档

共0课时 | 0人学习

Echo框架快速入门指南
Echo框架快速入门指南

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn