檔案型別檢查工具 jmimemagic原始碼解析

2021-09-02 20:43:48 字數 2173 閱讀 3254

在開發中,經常會有上傳檔案的需求,為了安全起見,防止上傳惡意檔案,需要對檔案型別進行檢查。網上一般有兩種方式:

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...