JAVA對圖片進行格式檢查 – JAVA編程語言程序開發技術文章

1)、判斷文件的擴展名是否是要求的圖片擴展名
不過這種方式非常的不妥,別人稍微的把一個不是圖片的文件的擴展名修改為圖片的擴展名,就繞開瞭你的這種校驗,
2)、根據文件的前面幾個字節 即常說的魔術數字進行判斷
魔術數字,指定是文件的最開頭的幾個用於唯一區別其它文件類型的字節,有瞭這些魔術數字,我們就可以很方便的區別不同的文件
比如,一個JPEG文件,它開頭的一些字節可能是類似這樣的”ffd8 ffe0 0010 4a46 4946 0001 0101 0047 ……JFIF…..G“
這裡”ffd8“就表示瞭這個文件是一個JPEG類型的文件
.bmp 42 4d
.gif 47 49 46 38
.png 89 50 4e 47
.bz 42 5a
.zip 50 4b 03 04
不同文件類型的開頭幾個字節,可以查看我的另外一篇專站介紹:表示不同文件類型的魔術數字。https://www.fenglibin.com/file_magic_numbers.html
但是這種判斷方式也是非常不靠譜的,因為他隻能夠驗證文件的前面幾個字節,如此時有人把一個可執行的PHP文件的擴展名修改為PNG,然後再在前面補上”89 50″兩個字節,就又繞開瞭這種驗證方式。
3)、獲取圖片的寬高屬性
如果能夠正常的獲取到一張圖片的寬高屬性,那肯定這是一張圖片,因為非圖片文件我們是獲取不到它的寬高屬性的,
4)、圖片的安全檢查。
通過判斷確實是一張圖片,可是如果是在一個可以正常瀏覽的圖片文件中加入一些非法的代碼,也將這張圖片放於網頁上打開,插入非法代碼可能會被執行,殺毒軟件(如AVAST)對這種修改是會報為病毒的。
可以對這個圖片進地重寫,給它增加水印或者對它進行resize操作,這樣新生成的圖片就不會再包含這樣的惡意代碼瞭
[java] 
/**
     * 讀取圖片前兩個字節
     * @param src
     * @return
     */ 
    public static String bytesToHexString(byte[] src) { 
        StringBuilder stringBuilder = new StringBuilder(); 
        if (src == null || src.length <= 0) { 
            return null; 
        } 
        for (int i = 0; i < src.length; i++) { 
            int v = src[i] & 0xFF;//byte to int 
            String hv = Integer.toHexString(v); 
            if (hv.length() < 2) { 
                stringBuilder.append(0); 
            } 
            stringBuilder.append(hv); 
        } 
        return stringBuilder.toString(); 
    } 
     
    /**
     * 通過判斷圖片的寬度和高度來確定是否是圖片
     * @param imageFile
     * @return
     */ 
     public static boolean isImage(File imageFile) { 
            if (!imageFile.exists()) { 
                return false; 
            } 
            Image img = null; 
            try { 
                img = ImageIO.read(imageFile); 
                if (img == null || img.getWidth(null) <= 0 || img.getHeight(null) <= 0) { 
                    return false; 
                } 
                return true; 
            } catch (Exception e) { 
                return false; 
            } finally { 
                img = null; 
            } 
        } 
 
    public static void main(String[] args) throws IOException { 
        String imagePath = "E:\\hwy.png"; 
        File image = new File(imagePath); 
        InputStream is = new FileInputStream(image); 
        //讀取兩個byte 
        byte[] bt = new byte[2];   www.aiwalls.com
        is.read(bt); 
        System.out.println(bytesToHexString(bt));//output 8950 
         
        boolean b = isImage(image); 
        System.out.println(b); 
    } 
作者:cdl2008sky

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *