现在大多网站都允许用户上传文件 通常上传文件时都需要做文件的类型校验,大致有如下几种方法:
1. 通过后缀名
2. 通过读取文件,获取文件的Content-type来判断。
3. 通过读取文件流,根据文件流中特定的一些字节标识来区分不同类型的文件。
4. 看是否能获取图片流判断图片
1,2是常用的手法 然而,在安全性较高的业务场景中,1,2两种方法的校验会被轻易绕过。
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
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
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 注意:word、msi 和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"); //flv与f4v相同
FILE_TYPE_MAP.put("00000020667479706d70","mp4");
FILE_TYPE_MAP.put("49443303000000002176","mp3");
FILE_TYPE_MAP.put("000001ba210001000180","mpg"); //
FILE_TYPE_MAP.put("3026b2758e66cf11a6d9","wmv"); //wmv与asf相同
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
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