在web开发中,我们经常遇到一些上传文件的功能, 我们在对文件进行校验时,除了对文件大小进行校验外,还需要对文件的格式进行校验. 在对格式校验的时候要考虑到用户或者攻击者对文件后缀进行的改变,导致上传的文件并不是我们需要的类型,从而对系统造成影响.

我们可以对常用的文件进行校验,如图片格式, 压缩格式,office word,Excel格式,以及其他文件的格式进行校验.
代码如下:

import java.io.*;
import java.util.HashMap;
import java.util.Map;/*** @ClassName FileFormatVerify* @Description  图片 pdf/wored/excel和各种压缩格式的校验**/
public class FileFormatVerify {private static  Map<String, Object> fileFormat = null;/*** @Description  将常用需要校验的格式和区别其他格式的前几个字节写入map* @Param []* @return**/public  FileFormatVerify (){//if(fileFormat == null ){fileFormat = new HashMap<String, Object>();//JPEGfileFormat.put("jpg","FFD8FFE0");//PNGfileFormat.put("png","89504E47");fileFormat.put("zip","504B0304");fileFormat.put("rar","52617221");//office类型,包括doc、xls和ppt
//           fileFormat.put("office","D0CF11E0");/*** docx ,xlsx和zip   相同  doc 和 xls 相同*/fileFormat.put("docx","504b0304");fileFormat.put("doc","d0cf11e0");fileFormat.put("xls","d0cf11e0");fileFormat.put("xlsx","504b0304");//fileFormat.put("pdf","255044462D312E");fileFormat.put("pdf","255044462");// }}/*** @Description 根据传入的文件获得后缀,获得指定文件格式byte[]数组中的前8位字符*              将传入文件转化为byte[]数组,取前8位.判断传入文件的前8位和我们指定好的文件byte[]的前8位是否相同,*              如果相同则文件格式没有被篡改,反之,文件后缀格式被篡改* @Param [file]* @return boolean 返回true 表示文件格式验证通过, 返回false 文件格式验证失败**/public boolean suffixVerify(File file){String fileType = "";String name = file.getName();int i = name.lastIndexOf(".");// 获取文件的后缀if(i > 0){fileType = name.substring(i + 1);}//根据文件的后缀获取,获取文件的byte[]的前8位if(fileFormat.containsKey(fileType.toLowerCase())){String fileByte8 = String.valueOf(fileFormat.get(fileType.toLowerCase()));//获取传入文件的byte[]的前8位byte[] bytes = inputStream2ByteArray(file);String compareByte = bytesToHexString(bytes);//如果传入文件的byte[]的前8位和我们定义好的byte[]的前8位相同,验证通过.if (compareByte.startsWith(fileByte8)){//如果格式校验成功return true;}else{return false;}}else{return false;}}/*** @Description  将file文件转化为byte[]* @Param [file]* @return byte[]**/   public  byte[] inputStream2ByteArray(File file){ByteArrayOutputStream bos = new ByteArrayOutputStream();FileInputStream fis = null;byte[] buffer = null;try {fis = new FileInputStream(file);//不用读取全部文件,只读文件前面的部分byte[] b = new byte[1024];fis.read(b);bos.write(b, 0, 1024);/**byte[] b = new byte[4];int n;while ((n = fis.read(b)) != -1){bos.write(b, 0, n);}*/buffer = bos.toByteArray();}catch (FileNotFoundException e){e.printStackTrace();}catch (IOException e1){e1.printStackTrace();}finally {try {if(fis !=null){fis.close();}}catch (Exception e){e.printStackTrace();}try {if(bos !=null){bos.close();}}catch (Exception e){e.printStackTrace();}}return buffer;}/*** @Description  取byte[]前8位的为字符串* @Param [src]* @return java.lang.String**/public  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().substring(0, 8);return stringBuilder.toString();}}

写一个测试类,测试是否有效.

import org.junit.Test;
import java.io.File;/*** @ClassName TestFileFormatVerify* @Description 测试FileFormatVerify类* @Author sun* Date 2019/5/8 14:57* @Version 1.0**/
public class TestFileFormatVerify {/*** @Description 测试传入参数后缀是否有篡改* @Param []* @return void**/@Testpublic void TestSuffixReg(){FileFormatVerify reg = new FileFormatVerify();File file = new File("E:\\ideaFile\\RegEx\\src\\1.xlsx");if (file.isFile() && file.exists()){boolean b = reg.suffixVerify(file);System.out.println(b);}}/*** @Description 查看传入文件格式的前几位字符* @Param []* @return void**/@Testpublic void CheckFileByte8(){FileFormatVerify reg = new FileFormatVerify();File file = new File("E:\\ideaFile\\RegEx\\src\\1.xlsx");byte[] bytes = reg.inputStream2ByteArray(file);String s = reg.bytesToHexString(bytes);System.out.println(s);}
}

注意:txt文件是一个纯文本文件,它的头文件字符是不固定的.
可以用测试类中的CheckFileByte8()方法. 对一个txt文件,改变其内容来查看它的头文件字符.

我们仅仅通过对文件后缀格式的校验,并不能保证上传文件是安全的.
本篇文章也是参考 太阳守护者Sunner.
这篇文章有有关图片的更加安全的校验方式. 可以参考帮助我们加强对上传文件的安全控制.

Java 对上传文件后缀格式的校验相关推荐

  1. Java 对上传文件进行魔数校验

    魔数这个词在不同领域代表不同的含义.在计算机领域,魔数有两个含义,一指用来判断文件类型的魔数(magic number):二指程序代码中的魔数,也称魔法值. 不是所有文件都有文件头的.一个.txt类型 ...

  2. java上传文件限制大小_Java Web:附件上传,两种文件上传限制格式及大小方法,学习笔记文件操作【诗书画唱】...

    附件上传: package com.jy.controller; import java.io.File; import java.io.FileOutputStream; import java.i ...

  3. java 上传文件注意事项

    java 上传文件注意事项 1.文件名有特殊字符的情况,所以最好是文件名前台url编码,后台再url解码,这点在下载的时候也一样 2.文件大小一定要设置,spring boot 有默认. 3.文件名校 ...

  4. JAVA上传文件图片到服务器保存

    这里我记录一个比较简单方便操作的JAVA上传文件图片到服务器并且保存! 首先是页面 html的   我这是提交一个文件和类型 <div style="border: 1px solid ...

  5. java上传文件图片到服务器保存,Java上传文件图片到服务器的方法

    这里我记录一个比较简单方便操作的java上传文件图片到服务器并且保存,具体内容如下 首先是页面html的   我这是提交一个文件和类型 我是添加一张临时图片得到微信的media_id保存数据库! en ...

  6. spring boot配置对上传文件的大小限制

    spring boot配置对上传文件的大小限制 spring-boot 2.0之前 Spring Boot1.4版本后配置更改为(默认单个文件最大1Mb,单次请求文件总数大小最大10Mb): spri ...

  7. Java上传文件到数据库

    Java上传文件到数据库 首先在开始本文之前推荐一篇我非常喜欢的博主--孤傲苍狼的一篇相关博文. JavaWeb学习总结(五十)--文件上传和下载 http://www.cnblogs.com/xdp ...

  8. dnscat使用——整体感觉这个工具不完善,失败率很高,传文件时候没有完整性校验,我自己测试时通过域名转发失败,可能是其特征过于明显导致...

    git clone https://github.com/iagox86/nbtool make 然后就可以按照下面的官方说明进行操作了. 我的感受:整体感觉这个工具不完善,失败率很高,传文件时候没有 ...

  9. java上传文件功能_Java MemoryMapped文件的功能

    java上传文件功能 Java MemoryMapped文件的功能 在JDK 1.4中,内存映射文件的一个有趣功能被添加到Java中,该功能允许将任何文件映射到OS内存以进行有效读取. 内存映射文件可 ...

  10. layui表单加文件 php_layui框架实现文件上传及TP3.2.3(thinkPHP)对上传文件进行后台处理操作示例...

    本文实例讲述了layui框架实现文件上传及TP3.2.3对上传文件进行后台处理操作.分享给大家供大家参考,具体如下: layui框架是1.0.9版本.. 首先html页面代码如下: js代码如下: l ...

最新文章

  1. hud抬头显示器哪个好_还在看汽车仪盘表?带你了解一下HUD抬头显示器,开车很方便...
  2. 2020-11-26((《深入理解计算机系统》多级页表详解)补充)
  3. ABAP性能优化之向内表添加纪录
  4. 区块链技术应用——站在风口上猪都会飞
  5. 竖屏小游戏--喵星战争源代码分析【完整】
  6. 人生是什么?——感悟1:勇于承担自己的选择才是真正的勇气
  7. opencv+Dlib人脸融合
  8. 绪论 数据库系统工程师考试分析
  9. [Python]一个简单的QQ截图
  10. LintCode 吹气球
  11. 【DRM】PlayReady数字版权保护系统
  12. 红色警戒2修改器原理百科(八)
  13. 九宫格六边形html,六边形拼图
  14. P106双N卡 自动调用方案
  15. 域名解析错误怎么办?
  16. MySQL——INSERT INTO
  17. 复旦2021计算机考研分数线,2021复旦大学考研录取分数线公布|附详情
  18. 基于Netty的Android局域网IP电话
  19. 【毕业设计】65-基于单片机的智能抢答器系统设计(原理图工程+仿真工程+源代码+答辩论文+visio流程图+实物图)
  20. Python入门第四天——[小甲鱼]零基础入门学习Python

热门文章

  1. 使用思科交换机Packet——Tracer模拟器教程
  2. 流量魔盒FlowBox 发行的代币是DMC骗局分析
  3. 批处理bat下载FTP服务器上某个目录下的文件
  4. 阿里云Blink快速入门
  5. 俄亥俄州立大学计算机硕士申请,俄亥俄州立大学计算机科学系
  6. Tomcat Caused by:java.lang.IllegalArgumentException: 指定的主资源集[……]无效
  7. 2011年中国科学院院士增选初步候选…
  8. 如何批量下载央视CNTV的节目视频
  9. Codeigniter 升级
  10. 导出vm镜像_openstack虚拟机导出镜像