什么时候该查这张表这张表在你要判断某个扩展名对应什么文件类型、能不能安全地在线预览时有用。它按文档、图片、音频视频、压缩包、代码与数据分类,给出扩展名、类型与说明。选上传白名单、判断预览策略时查它。
不该查的情况:你在做 MIME 类型的严格映射或服务端内容嗅探。扩展名与真实类型不是一回事(改个后缀就能骗过),安全判断必须读文件头字节而不是看扩展名。
判断标准:先问「要不要允许在线预览」。文本类(txt/md/csv/json)可直接渲染;图片要防 SVG(可含脚本)与 SVGZ;HTML 要防 XSS;PDF 要防内嵌 JS。**能下载就不要预览**是更安全的原则。
特别注意双扩展名攻击:`foo.pdf.html` 在某些服务端按第一个点截断,或反过来按最后一个扩展名判断类型。文件上传校验必须用完整文件名比对,不能只取最后一段。
边界与常见陷阱改后缀就能骗过基于扩展名的所有校验把 payload.html 改名成 payload.pdf,服务端只看扩展名就会用 PDF 处理器打开并渲染其中的脚本。真正的校验必须读**文件头魔数**:PNG 是 89 50 4E 47,PDF 是 25 50 44 46,JPEG 是 FF D8 FF,ZIP(也是 docx/xlsx 的容器)是 50 4B 03 04。安全实现要交叉验证:声明的类型、扩展名、魔数三者必须一致,任一不符就拒绝或转存为纯文本。
SVG 是最容易被忽略的可执行文件格式SVG 是 XML,可以内嵌