Javaweb 后台文件验证整理
2016-08-23 12:50
435 查看
现在大多网站都允许用户上传文件 通常上传文件时都需要做文件的类型校验,大致有如下几种方法:
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<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 注意: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 ~。~
dd08
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
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<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 注意: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 ~。~
dd08
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
相关文章推荐
- java project 和 javaWeb的读取文件路径问题(整理自百度经验,有空验证下)
- 在java后台验证文件是不是视频
- java web 通过前台输入的数据(name-value)保存到后台 xml文件中
- javaweb工程浏览器上传文件后台不显示文件信息的原因
- 使用webUploader上传文件时前台添加自定义参数(java后台获取)
- web项目java后台将html表格导出为word表格文件
- web通过from后台java上传文件
- webuploader java上传文件后台源码 mpush
- Maven构建SSM框架JavaWeb项目pom.xml文件整理
- JavaWeb从后台下载文件
- #java web#文件下载时需向后台传递大量参数
- 【总结】java 后台文件上传整理
- java 附件上传时后台验证上传文件的合法性
- Java Web应用动态生成PDF文件的问题整理
- java 附件上传时后台验证上传文件的合法性
- IT咨询顾问:一次吐血的项目救火 java或判断优化小技巧 asp.net core Session的测试使用心得 【.NET架构】BIM软件架构02:Web管控平台后台架构 NetCore入门篇:(十一)NetCore项目读取配置文件appsettings.json 使用LINQ生成Where的SQL语句 js_jquery_创建cookie有效期问题_时区问题
- 文件md5验证生成器(java版)
- 在 action 的 java 里面获得应用 WEB-INF 下面的文件的路径方法
- java web应用文件下载(包括中文文件名乱码处理)
- 使用HttpWebRequest和HttpWebResponse在后台进行文件的请求和响应