iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot后端上传文件类型检测方式
  • 912
分享到

SpringBoot后端上传文件类型检测方式

2024-04-02 19:04:59 912人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录本文通过文件流头部判断文件类型1、添加配置文件checkFileHeader.properties2、编写读取properties文件类3、编写拦截器4、配置拦截文件文件上传大部

文件上传大部分通过web前端判断后尾名或者service后端判断后尾名,这种操作具有一定的风险,比如:我可以将一个jsp页面,修改后尾名改成jpg文件进行上传,由于图片预览功能,这个文件会被执行,这时就可以发送用户数据到指定的服务下,窃取用户信息。

本文通过文件流头部判断文件类型

不同的文件具有不同的头部,比如:

不同的文件具有不同的头部信息,以SpringBoot为例,通过拦截器拦截文件流进行判断:

1、添加配置文件checkFileHeader.properties

在src/main/resources中增加配置文件checkFileHeader.properties,文件内容:

JPEG=FFD8FF
PNG=89504E47
GIF=47494638
TXT=75736167
pdf=255044462D312E
DOC=D0CF11E0
XML=3C3F786D6C
DOCX=504B0304
APK=504B030414000808
IPA=504B03040A000000

2、编写读取properties文件类

读取checkFileHeader.properties文件内容,用于拦截器判断


public class FileHeaderHelper {    
    private static FileHeaderHelper me ;
    private static List<String> headerList ; 
    private FileHeaderHelper(){}    
    public static FileHeaderHelper getInstance(){
        if(me == null){
            me = new FileHeaderHelper() ;
        }
        return me ;
    }
    
    public List<String> getHeaderList(){
        if(headerList == null){
            headerList = new ArrayList<String>() ;
            
            PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
            String classpathResource = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "/fileheader.properties";
            Properties p = new Properties();
            try {
                Resource[] res = resolver.getResources(classpathResource) ;
                for (Resource re : res) {
                    p.load(re.getInputStream());
                    break ;
                }
                
            } catch (ioException e) {
                e.printStackTrace();
            }
            for (Map.Entry<Object, Object> item : p.entrySet()) {
                headerList.add(item.getValue().toString()) ;
            }
        }        
        return headerList ;
    }
}

3、编写拦截器

拦截去中,获取文件流,读取文件流前8个字节,根据需要可以读取更多字节判读,8个字节转成16进制为16个字符串,我这里最长的APK/IPA文件也就16个字节,所以读取8个字节,读取字节后判断是否checkFileHeader.properties文件中字符串


public class FileHeaderCheckInterceptor implements HandlerInterceptor {
 
    @Override
    public boolean preHandle(httpservletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        // 判断是否为文件上传请求
        if (request != null && request instanceof MultipartHttpServletRequest) {
            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
            Map<String, MultipartFile> files = multipartRequest.getFileMap();
            Iterator<String> iterator = files.keySet().iterator();
            while (iterator.hasNext()) {
                String fORMKey = (String) iterator.next();
                MultipartFile multipartFile = multipartRequest.getFile(formKey);
                //String filename = multipartFile.getOriginalFilename();
                byte[] file = multipartFile.getBytes() ;
                
                获取字节流前8字节,差不多够了,不行再加
                int HEADER_LENGTH = 8 ;
                
                if(file.length>HEADER_LENGTH){
                    //转成16进制
                    StringBuilder sb = new StringBuilder();
                    for(int i=0;i<HEADER_LENGTH;i++){
                        int v = file[i] & 0xFF;     
                        String hv = Integer.toHexString(v);     
                        if (hv.length() < 2) {     
                            sb.append(0);     
                        }     
                        sb.append(hv);
                    }                    
                    
                    boolean isFound = false ;
                    String fileHead = sb.toString().toUpperCase() ;
                    List<String> headerList = FileHeaderHelper.getInstance().getHeaderList() ;
                    for(String header : headerList){
                        if(fileHead.startsWith(header)){
                            isFound = true ;
                            break ;
                        }
                    }
                    if(!isFound){
//                        throw new BaseRunException("上传文件有异常,已被系统禁止!") ;
                        System.out.println("----------上传文件有异常,已被系统禁止!头部信息:"+fileHead);
                        response.setCharacterEncoding("UTF-8");
                        response.setContentType("application/JSON;charset=utf-8"); 
                        PrintWriter printWriter = response.getWriter();    
                        printWriter.write("上传文件有异常,已被系统禁止!");    
                        return false; 
                    }
                }
            }
        }
        return true;
    }
 
    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub 
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub 
    }    
}

4、配置拦截文件

拦截器写完了,配置下让它生效,在Configuration中配置拦截器,拦截文件流进行判断

@Configuration
public class MyfWEBAppConfiguration extends WebmvcConfigurerAdapter {
    
    //拦截器,拦截文件流
    public void addInterceptors(InterceptorReGIStry registry) {
        registry.addInterceptor(new FileHeaderCheckInterceptor()) 
                .addPathPatterns("/**"); 
    }
    
//    //注册过滤
//    @Bean
//    public FilterRegistrationBean myFilterRegistration() {
//     
//       FilterRegistrationBean registration = new FilterRegistrationBean();
//       registration.setFilter(new LoginFilter());
//       registration.addUrlPatterns("/serviceInvoke");
//       //registration.addInitParameter("paramName", "paramValue");
//       registration.setName("loginFilter");
//       registration.setOrder(1);
//       return registration;
//     }
//    
//    
//    //注册servlet
//    @Bean  
//    public ServletRegistrationBean myServletRegistration() {  
//        ServletRegistrationBean registration = new ServletRegistrationBean(new DownloadServlet());  
//        registration.addUrlMappings("/download");  
//        return registration;  
//    } 
}

页面消息提醒已经在printWriter中输出了,根据自己的页面编写显示吧。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: SpringBoot后端上传文件类型检测方式

本文链接: https://www.lsjlt.com/news/143722.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot后端上传文件类型检测方式
    目录本文通过文件流头部判断文件类型1、添加配置文件checkFileHeader.properties2、编写读取properties文件类3、编写拦截器4、配置拦截文件文件上传大部...
    99+
    2024-04-02
  • 文件上传(前端JS检测)详解
    文件上传(前端JS检测)详解 function checkFile() { var file = document.getElementsByName('upload_file')[0].val...
    99+
    2023-09-09
    前端 javascript php 代码复审
  • springboot前端传参date类型后台处理的方式
    目录springboot前端传参date类型后台处理先说结论解决方法前端如何发送date类型的参数给后端首先阐述一下常见的几种时间类型的区别GET传参时Post传参时后端接收请求代码...
    99+
    2024-04-02
  • JavaScript 检测文件的类型的方法
    目录一、如何查看图片的二进制数据二、如何区分图片的类型三、如何检测图片的类型3.1 定义 readBuffer 函数3.2 定义 check 函数3.3 检测 PNG 图片类型我们会...
    99+
    2024-04-02
  • JavaScript怎么检测文件的类型
    这篇文章主要介绍JavaScript怎么检测文件的类型,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在日常工作中,文件上传是一个很常见的功能。在某些情况下,我们希望能限制文件上传的类型,比如限制只能上传 PNG 格式...
    99+
    2023-06-15
  • SpringBoot 上传文件判空以及格式检验流程
    目录加入依赖创建自定义注解以及实现类全局异常处理使用示例结果展示基于jsr303 通过自定义注解实现,实现思路: 存在一些瑕疵,后续补充完善。 加入依赖 部分版本已不默认自动引入该...
    99+
    2024-04-02
  • 如何使用JavaScript 检测文件的类型
    这篇文章将为大家详细讲解有关如何使用JavaScript 检测文件的类型,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、如何查看图片的二进制数据要查看图片对应的二进制数据,我们可以借助一些...
    99+
    2023-06-15
  • springboot多文件上传实现使用postman测试多文件上传接口
    使用postman测试多文件上传接口 1、创建测试类(FileController.java) package com.jeff.controller; import java....
    99+
    2024-04-02
  • Vue使用formData格式类型上传文件的示例
    在vue中,我们普遍是前后端分离项目,即需要使用axios等工具向后台发送请求实现对数据的操作。 其中,文件上传算是比较难的一种。这篇文章五分钟教会你上传文件。 1.如图片上传,后端...
    99+
    2024-04-02
  • springboot多文件上传如何实现使用postman测试多文件上传接口
    这篇文章给大家分享的是有关springboot多文件上传如何实现使用postman测试多文件上传接口的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用postman测试多文件上传接口1、创建测试类(FileCon...
    99+
    2023-06-20
  • PHP 文件上传前后端代码(笔记)
    本笔记中代码运行环境为Wampserver-3.2.9 前端上传文件代码 文件上传文件名: 如果需要保存大文件,需要在后端保存文件前,对php.ini配置文件进行修改 。 第一步、在wampserver文件bin目录中找到对应版本的apac...
    99+
    2023-08-31
    html php
  • SpringBoot文件上传大小设置方式(yml中配置)
    目录文件上传大小设置上传文件大小yml参数配置解决方法文件上传大小设置 #文件大小 MB必须大写 #  maxFileSize 是单个文件大小 #  maxRequestSize是设...
    99+
    2024-04-02
  • 致远OA文件上传漏洞(含批量检测POC)
    文章目录 文件上传wpsAssistServlet 任意文件上传漏洞描述漏洞影响网络测绘批量检测POC ajax.do 任意文件上传 CNVD-2021-01627漏洞漏洞描述漏洞影响漏...
    99+
    2023-09-01
    安全 致远OA Python
  • SpringBoot文件上传大小设置方式的示例分析
    这篇文章主要介绍SpringBoot文件上传大小设置方式的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!文件上传大小设置#文件大小 MB必须大写#  maxFileSize&nb...
    99+
    2023-06-29
  • Springboot导出文件,前端下载文件方式
    Springboot导出文件,前端下载文件 后端代码 可以把请求设置为post,我这里是Get @RequestMapping(value = "/download", met...
    99+
    2024-04-02
  • springboot+jersey+tomcat实现跨域方式上传文件到服务器的方式
    目录前言准备工作安装完成后后启动上传文件代码结语前言 在服务器上,当我们启动了tomcat,就可以以 http://ip地址:8080/文件路径/文件名 的方式,进行访问到我们服务器...
    99+
    2023-03-09
    springboot跨域方式上传文件到服务器 springboot jersey tomcat跨域上传文件 springboot 上传服务器
  • 关于JS数据类型检测的多种方式总结
    目录背景 判断数据类型的手段有哪些? 1. 用typeof判断基础数据类型: 2. 用instanceof判断对象数据类型3. 用contructor属性 4. toString方法...
    99+
    2024-04-02
  • django上传文件的三种方式
    目录Django文件上传需要考虑的重要事项Django文件上传的3种常见方式项目创建与设置创建模型URLConf配置使用一般表单上传文件使用ModelForm上传文件GitHub源码...
    99+
    2024-04-02
  • js中基于数据类型检测的方式有哪些
    这篇文章主要为大家展示了“js中基于数据类型检测的方式有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js中基于数据类型检测的方式有哪些”这篇文章吧。1、t...
    99+
    2024-04-02
  • ASP.net中怎么判断上传文件的类型
    本篇文章给大家分享的是有关ASP.net中怎么判断上传文件的类型,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、 安全性比较低,把文本文件1.txt改成1.jpg照样可以上传...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作