文件上传之验证后缀与内容是否一致

在上传前验证,开发者们往往喜欢通过后缀或者File.type()去判断一个文件类型来决定是否符合上传要求。但这显然是不可靠的,当被别有用心的人利用后,就可能在服务器被执行。今天就来解决如何在前端验证文件内容跟后缀是否一致。

1. Magic number

既然要解析文件内容那这个 Magic Number 就很关键 => Magic number:即幻数,它可以用来标记文件或者协议的格式,很多文件都有幻数标志来表明该文件的格式。
以下是常见的文件头:

文件类型文件头(16 进制)
JPEG (jpg)FFD8FF
JPEG (jpg)FFD8FF
PNG (png)89504E47
GIF (gif)47494638
TIFF (tif)49492A00
Windows Bitmap (bmp)424D
CAD (dwg)41433130
Adobe Photoshop (psd)38425053
Rich Text Format (rtf)7B5C727466
XML (xml)3C3F786D6C
HTML (html)68746D6C3E
Adobe Acrobat (pdf)255044462D312E
Email (eml)44656C69766572792D646174653A
Outlook Express (dbx)CFAD12FEC5FD746F
Outlook (pst)2142444E
MS Word/Excel (xls.or.doc)D0CF11E0
MS Access (mdb)5374616E64617264204A
WordPerfect (wpd)FF575043
Postscript (eps.or.ps)252150532D41646F6265
Quicken (qdf)AC9EBD8F
Windows Password (pwl)E3828596
ZIP Archive (zip)504B0304
RAR Archive (rar)52617221
Wave (wav)57415645
AVI (avi)41564920
Real Audio (ram)2E7261FD
Real Media (rm)2E524D46
MPEG (mpg)000001BA
MPEG (mpg)000001B3
Quicktime (mov)6D6F6F76
Windows Media (asf)3026B2758E66CF11
MIDI (mid)4D546864

2. 解析文件

通常上传文件我们都会获取File形式的文件;
FileReader 文档

// 1. 使用FileReader以ArrayBuffer的形式读取数据
// 2. 使用Uint8Array换取文件头,看截取前面几位就看具体需要了
const reader = new FileReader();
reader.onload = evt => {
  const result = new Uint8Array(evt.target.result.slice(0, 6));
  // 将截取的result和magic number比较
};
reader.readAsArrayBuffer(file);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值