为了防止一些用户将一些病毒文件上传到服务器,我们一般需要对上传的文件做合法性校验, 当时有时候简单的后缀和contentType校验任然还有风险,下面我们一起来讨论一下上传的文件需要做哪些合法性校验。
1、文件后缀校验
这层校验应该说是最基本的校验了,我们不能允许用户上传一些exe、jsp、php、asp、html等可执行的文件。
2、contentType校验
contentType是内容类型,它会告诉浏览器用什么形式、什么编码来读取这个文件。因此文件后缀和contentType有一个对应关系,上传文件的后缀和contentType应该是对应的,如果不对应则上传信息已被篡改。后缀和contentType关系表参考tomcat下conf/web.xml中。
3、上传图片校验
如果需要上传的文件是图片,必须对上传的文件是否是一个图片进行检验,否则如果用户将一个html文件修改后缀为图片并上传,在显示该图片时就会执行html文件中的内容,带来跨域攻击风险。
图片校验方式
(1)、通过ImageIO读取文件,如果抛出异常或者读取后的对象为null,表示该文件不是图片
/**
* 通过读取文件信息判断文件是否是图片
* @param imageFile
* @return
*/
public static boolean checkImageFileByRead(File imageFile){
try {
BufferedImage image = ImageIO.read(imageFile);
if(image == null){
log.error("The file could not be opened , it is not an image");
return false;
}
} catch (IOException e) {
log.error(e.getMessage(), e);
return false;
}
return true;
}
(2)、通过ImageIO读取文件成图片流,如果抛出异常或者读取后的流对象为null,表示文件不是图片
/**
* 通过将文件转换为图片流方式监测文件是否为图片
* @param imageFile
* @return
*/
public static boolean checkImageFileByIS(File imageFile){
try {
ImageInp