在web应用中,上传附件是很常见的操作,为了防止上传文件中有恶意攻击程序,必须验证文件是否安全,首先,也是最普通的,前后端程序都需要验证文件后缀名是否在自定义的白名单中,其次,后端通过文件流获取文件头信息,防止恶意木马文件,比如一张普通图片,文本工具打开后,内嵌有js代码;

/**文件类型白名单*/
protected static final List FILECONTENTTYPELIST = Arrays.asList(".jpg",".jpeg",".png",".bmp",".doc",".docx",".pdf",".rar",".zip",".xlsx",".xls");/**记录各个文件头信息及对应的文件类型*/protected static final Map<String, String> MFILETYPES = new HashMap<String, String>();static {// images          MFILETYPES.put("FFD8FFE0", ".jpg");MFILETYPES.put("89504E47", ".png");MFILETYPES.put("47494638", ".gif");MFILETYPES.put("49492A00", ".tif");MFILETYPES.put("424D", ".bmp");//PS和CADMFILETYPES.put("38425053", ".psd");MFILETYPES.put("41433130", ".dwg"); MFILETYPES.put("252150532D41646F6265",".ps");//办公文档类MFILETYPES.put("D0CF11E0", ".doc");MFILETYPES.put("504B0304", ".docx");MFILETYPES.put("7B5C727466", ".rtf");MFILETYPES.put("25504446", ".pdf");//视频或音频类MFILETYPES.put("3026B275",".wma");MFILETYPES.put("57415645", ".wav");MFILETYPES.put("41564920", ".avi");MFILETYPES.put("4D546864", ".mid");MFILETYPES.put("2E524D46", ".rm");MFILETYPES.put("000001BA", ".mpg");MFILETYPES.put("000001B3", ".mpg");MFILETYPES.put("6D6F6F76", ".mov");MFILETYPES.put("3026B2758E66CF11", ".asf");//程序文件MFILETYPES.put("3C3F786D6C", ".xml");MFILETYPES.put("68746D6C3E", ".html");MFILETYPES.put("7061636B", ".java");MFILETYPES.put("3C254020", ".jsp");MFILETYPES.put("4D5A9000", ".exe");    //压缩包MFILETYPES.put("52617221", ".rar");    MFILETYPES.put("1F8B08", ".gz");MFILETYPES.put("44656C69766572792D646174653A", ".eml");MFILETYPES.put("5374616E64617264204A", ".mdb");MFILETYPES.put("46726F6D", ".mht");MFILETYPES.put("4D494D45", ".mhtml");}/*** 根据文件的输入流获取文件头信息** @param filePath 文件路径* @return 文件头信息* @throws IOException */public static String getFileType(InputStream  is) throws IOException {byte[] b = new byte[4];if(is!=null){is.read(b, 0, b.length);}              return MFILETYPES.get(getFileHeader(b));}/*** 根据文件转换成的字节数组获取文件头信息** @param filePath*            文件路径* @return 文件头信息*/public static String getFileHeader(byte[] b) {     String value = bytesToHexString(b);return value;}/*** 将要读取文件头信息的文件的byte数组转换成string类型表示* 下面这段代码就是用来对文件类型作验证的方法,* 将字节数组的前四位转换成16进制字符串,并且转换的时候,要先和0xFF做一次与运算。* 这是因为,整个文件流的字节数组中,有很多是负数,进行了与运算后,可以将前面的符号位都去掉,* 这样转换成的16进制字符串最多保留两位,如果是正数又小于10,那么转换后只有一位,* 需要在前面补0,这样做的目的是方便比较,取完前四位这个循环就可以终止了* @param src要读取文件头信息的文件的byte数组* @return 文件头信息*/private static String bytesToHexString(byte[] src) {StringBuilder builder = new StringBuilder();if (src == null || src.length <= 0) {return null;}String hv;for (int i = 0; i < src.length; i++) {// 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写hv = Integer.toHexString(src[i] & 0xFF).toUpperCase();if (hv.length() < 2) {builder.append(0);}builder.append(hv);}return builder.toString();}

通过getFileType()方法,获取文件类型,与白名单进行对比;

上传附件格式限制与内容校验相关推荐

  1. vue3 el-upload 上传附件及预览 限制只能上传一个图片或者pdf格式的文件

    vue3 el-upload 上传附件及预览 限制只能上传一个图片或者pdf格式的文件 效果如图 直接看代码吧 template部分 <div class="file-upload&q ...

  2. salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件

    在classic环境中,salesforce提供了<apex:inputFile>标签用来实现附件的上传以及内容获取.salesforce 零基础学习(二十四)解析csv格式内容中有类似的 ...

  3. 织梦php版本图片不能上传,让dedecms织梦后台支持上传bmp格式的图片的教程

    在后台-系统-附件设置,里面添加了bmp,上传bmp格式图片系统还是会提示你"文件类型不正确!",那么有什么好的解决方法呢,请看下文. 1.后台-系统-附件设置,添加bmp 2.i ...

  4. 齐博php百度编辑器上传图片_齐博CMS整合百度编辑器上传附件的BUG以及解决办法...

    齐博CMS作为目前PHP类CMS中最草根的CMS,能够及时的为站长们着想,将开源的百度编辑器整合进程序,这是值得广大站长欢呼雀跃的事情.但就目前来说,齐博CMS与百度编辑器的整合还是存在一些细小的问题 ...

  5. 附件上传到文件服务器,文件服务器 上传附件

    文件服务器 上传附件 内容精选 换一换 WAF支持拦截multipart/form-data格式的数据包.您可以提交工单申请配置拦截multipart/form-data格式的数据包.Multipar ...

  6. SharePoint 2010 列表项代码绑定附件心得 (FileUpload上传附件)

    最近项目中用到在插入Item时绑定附件,可以上传多个附件,很快就写出来了,可是测试一侧老是有问题,经过多番折腾,终于算通过测试.SharePoint 2010上传附件需注意一下几点: 判断文件是否为空 ...

  7. 上传附件_留学落户|上传附件预审时一定一定要注意的问题!

    点击上方蓝色字体,关注启铭君. www.minqifudao.com 启铭君相信大家都知道,从2019年留学落户"一网通办"新系统上线,可以在网上进行材料申报,"让数据多 ...

  8. SharePoint 上传附件

    更改SharePoint自定义列表的新建页面,开发自定义控件,通过SPListItem newItem = List.Items.Add(), newItem["Title"]=& ...

  9. svg上传服务器无法显示,让WordPress支持上传SVG格式图片并显示在媒体库中的方法...

    让WordPress支持上传SVG格式图片并显示在媒体库中的方法 发布时间:2020-12-11 14:18:12 来源:亿速云 阅读:167 作者:小新 这篇文章将为大家详细讲解有关让WordPre ...

最新文章

  1. 【Python】多种方式实现生成验证码
  2. python程序编译之后、找不到生成的pyc文件_为什么主要的可运行的Python脚本没有被编译为pyc文件,如模块?...
  3. 递归算法1加到100_五种循环方法计算1加到100
  4. C语言串 typedef char String[MaxLength + 1]
  5. Python通过WMI读取主板BIOS信息
  6. php垂直居中代码_纯css实现水平和垂直居中
  7. 即将面世——AWS SDK for Go
  8. vscode过滤pyc文件
  9. Spring框架七大核心模块
  10. Go 反射机制详解及实例 【Go语言圣经笔记】
  11. 这有300+门刚刚开课的编程计算机科学免费课程大集合
  12. lenove Anti-Vieus Powered by Huorong Security保护已过期怎么办
  13. 阿里巴巴经典智力问题
  14. CAN总线隔离器 插入式CAN总线隔离器
  15. 某数字公司VMP脱壳简记---native的OnCreate还原
  16. [性能实验]INS山寨版---开篇
  17. 重读《重构》,呼唤匠艺
  18. 狮子座适合计算机网络吗,适合狮子座的网名
  19. vue实现时间转换功能(年月日时分秒)
  20. Architect Inside I - 五年后的软件界

热门文章

  1. Xcode 10 无开发者账号通过无线网络真机调试
  2. c语言三个灯一直亮 一个灯闪烁,电脑键盘不能用了,三个指示灯一直在闪,也用不了,是为什么...
  3. Android用MediaCodec将相机预览帧编码成MP4视频
  4. 关于android模拟器上面物理键盘失效,电脑键盘也无法输入的解决
  5. 记录:mysql的binlog日志开启与数据恢复
  6. dell emc isilon解决添加AD域后有时间不同步警告
  7. IP和局域网 简单了解
  8. 百度飞桨AI达人创造营 | Day01:创意是如何诞生的
  9. JAVA+appium+夜神模拟器实现APP爬虫
  10. 无监督关键短语的生成问题博客02--extract.py的分析