Javaweb 后台文件验证整理


现在大多网站都允许用户上传文件  通常上传文件时都需要做文件的类型校验,大致有如下几种方法:

1. 通过后缀名

2. 通过读取文件,获取文件的Content-type来判断。

3. 通过读取文件流,根据文件流中特定的一些字节标识来区分不同类型的文件。

4. 看是否能获取图片流判断图片

1,2是常用的手法 然而,在安全性较高的业务场景中,12两种方法的校验会被轻易绕过。

1)直接修改后缀名

2)修改数据源 伪造文件的Content-type

3,4种相对安全但性能稍差4只能处理图片,根据项目需要可以自行取舍

但是若通过修改文件流的方法,给一张本身合法的图片中强行写入一些恶意代码,或者病毒代码,这样前面的方法仍然能够顺利通过,因为它本身是张正确格式的图片,仅仅读取字节与获取图片类型无法做到清除这种类型图片中隐藏的恶意代码

参考源文:http://blog.csdn.net/shixing_11/article/details/5720838

这位兄弟给出了一个图片处理解决方案  10年的文字 也没找到更详细的资料 感觉不太美

另一种方案:从环境上来处理 对文件目录设置权限 杀毒软件处理

最好的方案还是交给云文件服务器吧  万事大吉了 哈哈

废话一片下面上参考代码:

方法4

1、
ImageInputStream iis = ImageIO.createImageInputStream(resFile);//resFile为需被
Iterator<ImageReader> iter = ImageIO.getImageReaders(iis);
if (!iter.hasNext()) {//文件不是图片
    System.out.println("此文件不为图片文件");
}
2、
BufferedImage bi = ImageIO.read(resFile);
if(bi == null){
   System.out.println("此文件不为图片文件");
}

方法3:

package com;  

  

import java.io.FileInputStream;  

import java.io.FileNotFoundException;  

import java.io.IOException;  

import java.util.Date;  

import java.util.HashMap;  

import java.util.Iterator;  

import java.util.Map;  

import java.util.Set;  

  

public class FileType {  

      

    public final static Map<String, String>FILE_TYPE_MAP =new HashMap<String, String>();       

      

    private FileType(){}       

    static{       

        getAllFileType(); //初始化文件类型信息       

    }       

           

    /**    

     * Discription:[getAllFileType,常见文件头信息]  

     */       

    private static void getAllFileType()       

    {       

        FILE_TYPE_MAP.put("ffd8ffe000104a464946","jpg"); //JPEG (jpg)       

        FILE_TYPE_MAP.put("89504e470d0a1a0a0000","png"); //PNG (png)       

        FILE_TYPE_MAP.put("47494638396126026f01","gif"); //GIF (gif)       

        FILE_TYPE_MAP.put("49492a00227105008037","tif"); //TIFF (tif)       

        FILE_TYPE_MAP.put("424d228c010000000000","bmp"); //16色位图(bmp)       

        FILE_TYPE_MAP.put("424d8240090000000000","bmp"); //24位位图(bmp)       

        FILE_TYPE_MAP.put("424d8e1b030000000000","bmp"); //256色位图(bmp)       

        FILE_TYPE_MAP.put("41433130313500000000","dwg"); //CAD (dwg)       

        FILE_TYPE_MAP.put("3c21444f435459504520","html"); //HTML (html)  

        FILE_TYPE_MAP.put("3c21646f637479706520","htm"); //HTM (htm)  

        FILE_TYPE_MAP.put("48544d4c207b0d0a0942","css"); //css  

        FILE_TYPE_MAP.put("696b2e71623d696b2e71","js"); //js  

        FILE_TYPE_MAP.put("7b5c727466315c616e73","rtf"); //Rich Text Format (rtf)       

        FILE_TYPE_MAP.put("38425053000100000000","psd"); //Photoshop (psd)       

        FILE_TYPE_MAP.put("46726f6d3a203d3f6762","eml"); //Email [Outlook Express 6] (eml)         

        FILE_TYPE_MAP.put("d0cf11e0a1b11ae10000","doc"); //MS Excel 注意:wordmsi 和excel的文件头一样       

        FILE_TYPE_MAP.put("d0cf11e0a1b11ae10000","vsd"); //Visio 绘图       

        FILE_TYPE_MAP.put("5374616E64617264204A","mdb"); //MS Access (mdb)        

        FILE_TYPE_MAP.put("252150532D41646F6265","ps");       

        FILE_TYPE_MAP.put("255044462d312e350d0a","pdf"); //Adobe Acrobat (pdf)     

        FILE_TYPE_MAP.put("2e524d46000000120001","rmvb"); //rmvb/rm相同    

        FILE_TYPE_MAP.put("464c5601050000000900","flv"); //flvf4v相同    

        FILE_TYPE_MAP.put("00000020667479706d70","mp4");   

        FILE_TYPE_MAP.put("49443303000000002176","mp3");   

        FILE_TYPE_MAP.put("000001ba210001000180","mpg"); //       

        FILE_TYPE_MAP.put("3026b2758e66cf11a6d9","wmv"); //wmvasf相同      

        FILE_TYPE_MAP.put("52494646e27807005741","wav"); //Wave (wav)    

        FILE_TYPE_MAP.put("52494646d07d60074156","avi");    

        FILE_TYPE_MAP.put("4d546864000000060001","mid"); //MIDI (mid)     

        FILE_TYPE_MAP.put("504b0304140000000800","zip");      

        FILE_TYPE_MAP.put("526172211a0700cf9073","rar");     

        FILE_TYPE_MAP.put("235468697320636f6e66","ini");     

        FILE_TYPE_MAP.put("504b03040a0000000000","jar");   

        FILE_TYPE_MAP.put("4d5a9000030000000400","exe");//可执行文件  

        FILE_TYPE_MAP.put("3c25402070616765206c","jsp");//jsp文件  

        FILE_TYPE_MAP.put("4d616e69666573742d56","mf");//MF文件  

        FILE_TYPE_MAP.put("3c3f786d6c2076657273","xml");//xml文件  

        FILE_TYPE_MAP.put("494e5345525420494e54","sql");//xml文件  

        FILE_TYPE_MAP.put("7061636b616765207765","java");//java文件  

        FILE_TYPE_MAP.put("406563686f206f66660d","bat");//bat文件  

        FILE_TYPE_MAP.put("1f8b0800000000000000","gz");//gz文件  

        FILE_TYPE_MAP.put("6c6f67346a2e726f6f74","properties");//bat文件  

        FILE_TYPE_MAP.put("cafebabe0000002e0041","class");//bat文件  

        FILE_TYPE_MAP.put("49545346030000006000","chm");//bat文件  

        FILE_TYPE_MAP.put("04000000010000001300","mxp");//bat文件  

        FILE_TYPE_MAP.put("504b0304140006000800","docx");//docx文件  

        FILE_TYPE_MAP.put("d0cf11e0a1b11ae10000","wps");//WPS文字wps、表格et、演示dps都是一样的  

        FILE_TYPE_MAP.put("6431303a637265617465","torrent");  

        //txt文档全文不含0 ~~  

            

        FILE_TYPE_MAP.put("6D6F6F76","mov"); //Quicktime (mov)    

        FILE_TYPE_MAP.put("FF575043","wpd"); //WordPerfect (wpd)     

        FILE_TYPE_MAP.put("CFAD12FEC5FD746F","dbx"); //Outlook Express (dbx)       

        FILE_TYPE_MAP.put("2142444E","pst"); //Outlook (pst)        

        FILE_TYPE_MAP.put("AC9EBD8F","qdf"); //Quicken (qdf)       

        FILE_TYPE_MAP.put("E3828596","pwl"); //Windows Password (pwl)           

        FILE_TYPE_MAP.put("2E7261FD","ram"); //Real Audio (ram)       

    }                       

      

    /**

     * 得到上传文件的文件头

     * @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;  

            String hv = Integer.toHexString(v);  

            if (hv.length() < 2) {  

                stringBuilder.append(0);  

            }  

            stringBuilder.append(hv);  

        }  

        return stringBuilder.toString();  

    }  

      

    /**

     * 根据制定文件的文件头判断其文件类型

     * @param filePaht

     * @return 

     */  

    public static String getFileType(StringfilePaht){  

        String res = null;  

        try {  

            FileInputStream is = new FileInputStream(filePaht);  

            byte[] b = new byte[10];  

            is.read(b, 0,b.length);  

            String fileCode = bytesToHexString(b);    

              

            System.out.println(fileCode);  

              

              

            //这种方法在字典的头代码不够位数的时候可以用但是速度相对慢一点  

            Iterator<String> keyIter =FILE_TYPE_MAP.keySet().iterator();  

            while(keyIter.hasNext()){  

                String key = keyIter.next();  

                if(key.toLowerCase().startsWith(fileCode.toLowerCase()) ||fileCode.toLowerCase().startsWith(key.toLowerCase())){  

                    res = FILE_TYPE_MAP.get(key);  

                    break;  

                }  

            }  

        } catch (FileNotFoundExceptione) {  

            e.printStackTrace();  

        } catch (IOExceptione) {  

            e.printStackTrace();  

        }  

        return res;  

    }  

  

    public static void main(String[]args) throws Exception {  

          

        String type = getFileType("C:/test/eee.WMV");  

        System.out.println("eee.WMV : "+type);  

        System.out.println();   

          

        type = getFileType("C:/test/350996.wav");  

        System.out.println("350996.wav : "+type);  

        System.out.println();   

                  

    }  

}  

 

原文:http://blog.csdn.net/songylwq/article/details/6139753

//http://www.cnblogs.com/zlgxzswjy/p/5193590.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值