前言
在Web项目中,用户上传的文件可能是用户恶意篡改的病毒文件,所以为了避免这种情况,需要对文件的后缀名进行过滤.
通过对后缀名的判断只能够简单的验证文件,如果用户恶意更改了文件的后缀名,这种判断就不起作用了.所以还需要对文件的字节进行验证,每一个文件都有自己的魔术数字.也就是在一个文件的开头部分的字节码,用winhex-19.8(下载下来之后有个木马文件,删除掉就可以,不影响使用)查看一个文件的字节码,就能够知道该类型文件的魔术数字.通过判断魔术数字,就能够起到验证文件的作用.
以下程序通过HashMap存储了后缀名和字节码,实现了对上传文件的验证.
FileType为验证的主方法,在FileUtil中只是控制文件上传.大家可以拿去做个参考.
对于图片类型,通过判断图片的宽和高是否有0来实现对文件的验证.
FileType.java
package com.mbyte.easy.util;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
/**
* @Description : 读取文件的后缀名
*
* @author : 申劭明
* @date : 2019/9/2 19:42
*/
public class FileType
{
/**
* key是文件尾缀,value是文件的魔术数字
*/
public final static Map<String, String> FILE_TYPE_MAP = new HashMap<>();
private FileType(){}
static{
//初始化文件类型信息
getAllFileType();
}
/**
* @Description : 用静态方法初始化FILE_TYPE_MAP
*
* @author : 申劭明
* @date : 2019/9/2 19:41
*/
private static void getAllFileType()
{
//图片文件
FILE_TYPE_MAP.put("jpg", "FFD8FF");
FILE_TYPE_MAP.put("png", "89504E47");
FILE_TYPE_MAP.put("gif", "47494638");
FILE_TYPE_MAP.put("tif", "49492A00");
FILE_TYPE_MAP.put("bmp", "424D");
FILE_TYPE_MAP.put("dwg", "41433130");
FILE_TYPE_MAP.put("html", "68746D6C3E");
FILE_TYPE_MAP.put("rtf", "7B5C727466");
FILE_TYPE_MAP.put("xml", "3C3F786D6C");
FILE_TYPE_MAP.put("zip", "504B0304");
FILE_TYPE_MAP.put("rar", "52617221");
//Photoshop (psd)
FILE_TYPE_MAP.put("psd", "38425053");
//Email [thorough only] (eml)
FILE_TYPE_MAP.put("eml", "44656C69766572792D646174653A");
//Outlook Express (dbx)
FILE_TYPE_MAP.put("dbx", "CFAD12FEC5FD746F");
//Outlook (pst)
FILE_TYPE_MAP.put("pst", "2142444E");
//MS Word
FILE_TYPE_MAP.put("xls", "D0CF11E0");
//MS Excel 注意:word 和 excel的文件头一样
FILE_TYPE_MAP.put("doc", "D0CF11E0");
//MS Access (mdb)
FILE_TYPE_MAP.put("mdb", "5374616E64617264204A");
//WordPerfect (wpd)
FILE_TYPE_MAP.put("wpd", "FF575043");
FILE_TYPE_MAP.put("eps", "252150532D41646F6265");
FILE_TYPE_MAP.put("ps", "252150532D41646F6265