如何从Base64字符串获取文件扩展名/MIME类型并完成格式校验
基于魔数的文件类型校验解决方案
你可以按照以下方案实现完全不依赖文件名后缀的文件类型校验:
前置处理逻辑
你拿到的Base64字符串不需要全量解码,只需要取前20个字节的二进制内容就可以覆盖绝大多数文件的魔数长度,能大幅降低大文件校验的性能损耗。如果Base64带有data:[mime];base64,这类格式前缀,先把前缀去掉再做解码。
通用魔数对应表(覆盖99%常用业务场景)
你可以直接用下表整理自己的校验规则,所有魔数为十六进制格式:
FF D8 FF:jpg/jpeg,对应MIME类型image/jpeg89 50 4E 47 0D 0A 1A 0A:png,对应MIME类型image/png47 49 46 38:gif,对应MIME类型image/gif42 4D:bmp,对应MIME类型image/bmp25 50 44 46:pdf,对应MIME类型application/pdf50 4B 03 04:zip、docx、xlsx、pptx、apk、jar,通用MIME类型application/zip,细分类型可进一步解析内部结构判断D0 CF 11 E0 A1 B1 1A E1:doc、xls、ppt,对应MIME类型application/msword52 61 72 21 1A 07 00:rar,对应MIME类型application/x-rar-compressed1F 8B 08:gz,对应MIME类型application/gzip75 73 74 61 72:tar,对应MIME类型application/x-tar4D 5A:exe、dll,对应MIME类型application/octet-stream3C 3F 78 6D 6C 20:xml,对应MIME类型text/xml3C 68 74 6D 6C/3C 21 44 4F 43 54 59 50 45 20 68 74 6D 6C:html,对应MIME类型text/htmlFF FB/FF F3/FF F2/49 44 33:mp3,对应MIME类型audio/mpeg00 00 00 20 66 74 79 70 69 73 6F 6D/00 00 00 18 66 74 79 70 6D 70 34 32:mp4,对应MIME类型video/mp41A 45 DF A3:mkv,对应MIME类型video/x-matroska
校验流程建议
- 解码Base64前20个字节,转为统一大小写的十六进制字符串
- 用十六进制字符串和魔数表做前缀匹配,得到校验出的文件类型
- 可按需将校验出的类型和文件名后缀做二次比对,不符合的直接拦截
- 针对无固定魔数的文本类文件(txt、json、csv等),补充内容特征校验:比如json尝试做格式解析、csv校验分隔符和行列结构、txt校验是否全为可打印字符
注意事项
魔数校验是基础校验手段,无法100%判定文件真实类型,建议搭配文件大小限制、内容恶意特征扫描等多重规则共同校验,避免恶意文件拼接绕过。
内容的提问来源于stack exchange,提问作者campi
相关产品推荐
相关产品推荐

