跳到主要内容

文件 MIME 类型识别指南:为什么扩展名靠不住,要看文件头魔数

文件扩展名能随手改, 真实格式藏在文件头的魔数里。这篇讲清 MIME 类型、magic number 识别原理、上传校验和排查伪装文件的方法, 以及本地解析不上传的好处。

发布于 作者 李雷
#文件类型 #MIME #magic number #文件签名 #上传校验

文件 MIME 类型识别指南:扩展名能改,文件头不会骗你

我接过一个客服工单,用户说一张图片传不上去,系统提示"格式不支持"。文件叫 photo.png,扩展名明明是 PNG。我把它的前几个字节读出来一看,开头是 FF D8 FF,这是 JPEG 的签名。有人把一张 JPEG 直接改名成了 .png,浏览器和后端校验都按真实内容判断,自然就拒了。这种情况靠肉眼看扩展名永远查不出来。

扩展名只是文件名的一部分

.png.pdf.zip 这些后缀,本质上只是文件名里的一段字符串。把 report.pdf 改成 report.txt,文件内容一个字节都没变,只是名字变了。操作系统拿扩展名去关联默认打开程序,但这不代表内容真的是那个格式。对一个想伪装文件的人来说,改扩展名是零成本的事。所以判断文件"到底是什么",不能只信扩展名。

MIME 类型是另一个维度

MIME 类型是一套标准化的内容类型标识, 比如 image/pngapplication/pdftext/csv。浏览器在你选择文件时会给出一个它认为的 MIME 类型,服务器在响应里也会带 Content-Type。但浏览器报的 MIME 同样依赖文件来源的元数据,不是逐字节分析出来的, 它可能跟着错误的扩展名一起错。想查某个扩展名对应哪些标准 MIME, 可以用 /zh/t/mime-type-lookup/ 做对照。

真正可靠的是文件头魔数

magic number(魔数)指文件开头固定位置的几个字节,是格式自带的"指纹"。绝大多数二进制格式都在文件最前面写死了一段签名,改名改不掉它。几个常见例子:

  • PNG:开头是 89 50 4E 47(十六进制),后面三字节正好是 ASCII 的 PNG
  • JPEG:开头是 FF D8 FF
  • PDF:开头是 25 50 44 46,也就是 ASCII 的 %PDF
  • ZIP(以及基于 ZIP 的 docx、xlsx、jar 等):开头是 50 4B 03 04,即 PK..
  • GIF:开头是 47 49 46 38,即 GIF8

回到开头那个工单。文件名是 photo.png,但读出前 4 字节是 FF D8 FF E0,命中 JPEG 签名而不是 PNG 的 89 50 4E 47。结论一目了然:这是张被改名的 JPEG。把它真正转成 PNG,或者让用户重新导出,问题就解决了。这种"扩展名说一套,文件头说另一套"的不匹配,正是文件签名检查最能发挥作用的地方。

三个常见用途

上传校验:很多系统只校验扩展名,这是安全隐患。攻击者可以把脚本改成图片扩展名混过前端。更稳的做法是同时看 MIME 和魔数,三者一致才放行,任何一项对不上都该警惕。

排查格式不符:供应商导出的文件经常扩展名乱标。明明叫 data.csv,文件头却是 ZIP 的 PK,说明它其实是个压缩包。先把真实类型查清楚,再决定用什么程序打开,少走很多弯路。

识别伪装文件:把可执行文件、压缩包伪装成图片或文档,是常见的投递手法。对一批来路不明的附件,先批量列出每个文件的扩展名、MIME、文件头签名,做成一张证据表,谁名实不符立刻现形。

常见类型速查

平时高频会遇到的:图片类 PNG / JPEG / GIF / WebP / SVG(SVG 是文本, 看是否以 <?xml<svg 开头),文档类 PDF,压缩类 ZIP / gzip / RAR,而 Office 的 docx、xlsx、pptx 其实都是 ZIP 容器,文件头都是 PK,要再看内部结构才能区分。纯文本(txt、csv、json)没有强签名,这类只能靠看实际内容判断,单凭文件头不够。

为什么本地解析很重要

判断文件类型只需要读文件最前面那几十个字节,完全可以在浏览器里完成,根本不必把文件传到任何服务器。这一点对涉及合同、隐私附件、内部数据的场景尤其关键:文件一旦上传到第三方,你就失去了对它的控制。/zh/t/file-mime-type-inspector/ 就是按这个原则做的,拖入文件后,文件名、字节大小、浏览器 MIME、扩展名、前 16 字节十六进制和魔数签名全在本地算出来,文件本身不会离开你的电脑。需要留存的话,可以导出成 CSV 证据表交给客服或合规复核。

要提醒一句:魔数检查只回答"它像什么格式",不是病毒扫描,也不能替代取证分析。命中签名说明格式特征对得上,真要处理高风险文件,还得交给专业的安全工具继续看。但作为上传前、排查中的第一道快速判断,看文件头永远比看扩展名靠谱。


Made by Toolora · Updated 2026-06-13