在開發中,經常會有上傳檔案的需求,為了安全起見,防止上傳惡意檔案,需要對檔案型別進行檢查。網上一般有兩種方式:
1、對副檔名進行檢查,符合指定副檔名的檔案才可以上傳成功
2、對檔案頭進行檢查,檔案頭的魔數符合預期(每種檔案的魔數都是已知的),才可以上傳成功
第1種方式有明顯的缺陷,使用者可以通過修改副檔名來通過檢查,
第2種方式可以滿足絕大多數場景,但是也有缺點,它不去判斷副檔名
jmimemagic就是利用檔案頭中的魔數來判斷檔案型別的開源工具。
其位址見:
其獲取檔案型別流程如下:
說明:1、整個過程中,涉及幾個重要的類:
a、magic:jmimemagic工具對外互動介面類,類中方法都是static方法。主要的方法有:getmagicmatch(file, boolean)、getmagicmatch(file, boolean, boolean)
b、magicparser:magic.xml檔案解析類,將magic.xml中的資料解析為內部物件,底層解析使用到saxparse。
c、magicmatch:magic.xml檔案中match標籤對應的物件
d、magicmatcher:將檔案和magicmatch關聯起來的工具類
2、左側虛線框主要載入解析magic.xml檔案,解析的結果就是magicmatcher列表和hintmap列表
a、 magic.xml的**片段如下:
b, 32 kbits
0x10
每乙個match標籤對解析後得到乙個magicmatch物件,乙個magicmatch物件存放在magicmatcher物件中。
b、類magicmacth的屬性如下:
private string mimetype = null;
private string extension = null;
private string description = null;
private bytebuffer test = null;
private int offset = 0;
private int length = 0;
// possible types:
// byte, short, long, string, date, beshort, belong, bedate, leshort,
// lelong, ledate, regex
private string type = "";
private long bitmask = 0xffffffffl;
private char comparator = '\0';
private listsubmatches = new arraylist(0);
private mapproperties;
3、右側的虛線框主要是根據檔案獲取magicmatch
a、如果傳入方法magic#getmagicmatch的引數exthints=true,那麼優先使用副檔名去獲取magicmatch,只有根據副檔名獲取不到magicmatch的情況下,才會遍歷整個matchers去獲取對應的magicmatch。因此,一般exthints的入參值為true。
b、特殊情況下,獲取不到magicmatch,就會丟擲異常。
4、測試**:
public class testmagic catch (exception exp)
string mimetype = magicmatch.getmimetype();
system.out.println("file mime type is : " + mimetype); }
}總結:
jmimemagic是乙個很好的獲取檔案mimetype的工具類,對於大多數檔案來說,都可以判斷出其檔案mimetype,如果不能判斷,則可以對magic.xml進行擴充套件使其滿足要求。但是,如果在檔案尾部人為寫入一些內容,可以躲過該工具的檢測。
在本文開始提到過,可以使用副檔名或者檔案頭來判斷檔案型別,但是各有優劣,我們可以聯合兩種方式來判斷:首先判斷副檔名,在副檔名滿足要求的情況下,再檢測檔案頭,如果檔案頭檢測通過,即使檔案中被寫入惡意**,這些惡意**也不會執行。
php檢查檔案型別
php檢驗檔案型別 這一種方式很好實現,也就是取出檔案的副檔名就可以了,且這是效率最好的,這種方式很不安全,如出現沒有副檔名的檔案怎麼辦呢?這在windows上面很少出現沒有副檔名的檔案,但是在linux上面沒有副檔名的檔案很多,所以單獨以副檔名來區分檔案的型別不是很合適 php上傳檔案型別檢測 基...
檔案上傳時檔案型別判斷工具類
此處以副檔名判斷,可以通過魔數判斷上傳檔案的型別,不管是傳入的檔案有字尾名,還是無字尾名,或者修改了字尾名,真正獲取到的才是該檔案的實際型別,這樣避免了一些想通過修改字尾名或者content type資訊來攻擊的因素。package com.nari.common.utils classname f...
Linux檔案型別詳解 (幾種簡單檔案型別)
普通檔案一般為灰色字型,綠色字型的是可執行檔案,紅色字型的是壓縮檔案。檔案屬性 檔案型別 普通檔案,即 file d目錄檔案 b裝置檔案 block device 如 硬碟 c字元裝置檔案 character device l鏈結檔案 symbolic link 又稱軟鏈結檔案 p管道檔案 pipe...