在上傳前驗證,開發者們往往喜歡通過後綴或者
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);