SpringBoot如何验证用户上传的图片资源
这篇文章主要介绍了在SpringBoot中验证用户上传的图片资源,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 |
允许用户上传图片资源(头像,发帖)是APP常见的需求,特别需要把用户的资源IO到磁盘情况下,需要防止坏人提交一些非法的文件,例如木马,webshell,可执行程序等等。这类非法文件不仅会导致客户端图片资源显示失败,而且还会给服务器带来安全问题。
通过文件后缀判断文件的合法性
这种方式比较常见,也很简单,是目前大多数APP选择的做法。
public Object upload (@RequestParam("file") MultipartFile multipartFile) throws IllegalStateException, IOException {// 原始文件名称String fileName = multipartFile.getOriginalFilename();// 解析到文件后缀,判断是否合法int index = fileName.lastIndexOf(".");String suffix = null;if (index == -1 || (suffix = fileName.substring(index + 1)).isEmpty()) {return "文件后缀不能为空";}// 允许上传的文件后缀列表Set allowSuffix = new HashSet<>(Arrays.asList("jpg", "jpeg", "png", "gif"));if (!allowSuffix.contains(suffix.toLowerCase())) {return "非法的文件,不允许的文件类型:" + suffix;}// 序列化到磁盘中的文件上传目录, /upload// FileCopyUtils.copy 方法会自动关闭流资源FileCopyUtils.copy(multipartFile.getInputStream(), Files.newOutputStream(Paths.get("D://upload", fileName), StandardOpenOption.CREATE_NEW));// 返回相对访问路径,文件名极有可能带中文或者空格等字符,进行uri编码return "/" + UriUtils.encode(fileName, StandardCharsets.UTF_8); }
使用 ImageIO 判断是否是图片
这个方法就比较严格了,在判断后缀的基础上,使用Java的ImageIO类去加载图片,尝试读取其宽高信息,如果不是合法的图片资源。则无法读取到这两个数据。就算是把非法文件修改了后缀,也可以检测出来。
public Object upload (@RequestParam("file") MultipartFile multipartFile) throws IllegalStateException, IOException {// 原始文件名称String fileName = multipartFile.getOriginalFilename();// 解析到文件后缀int index = fileName.lastIndexOf(".");String suffix = null;if (index == -1 || (suffix = fileName.substring(index + 1)).isEmpty()) {return "文件后缀不能为空";}// 允许上传的文件后缀列表Set allowSuffix = new HashSet<>(Arrays.asList("jpg", "jpeg", "png", "gif"));if (!allowSuffix.contains(suffix.toLowerCase())) {return "非法的文件,不允许的文件类型:" + suffix;}// 临时文件File tempFile = new File(System.getProperty("java.io.tmpdir"), fileName);try {// 先把文件序列化到临时目录multipartFile.transferTo(tempFile);try {// 尝试IO文件,判断文件的合法性BufferedImage bufferedImage = ImageIO.read(tempFile);bufferedImage.getWidth();bufferedImage.getHeight();} catch (Exception e) {// IO异常,不是合法的图片文件,返回异常信息return "文件不是图片文件";}// 复制到到上传目录FileCopyUtils.copy(new FileInputStream(tempFile), Files.newOutputStream(Paths.get("D://upload", fileName), StandardOpenOption.CREATE_NEW));// 返回相对访问路径return "/" + UriUtils.encode(fileName, StandardCharsets.UTF_8);} finally {// 响应客户端后,始终删除临时文件tempFile.delete();} }
总结
使用ImageIo的方式更为保险,但是需要多几次IO操作。比较消耗性能。而且今天APP大都是用云存储服务,类似于阿里云的OSS。直接就把客户端上传的文件PUT到了云端,才不管用户上传的图片是不是真正的图片,非法上传,最多导致客户端不能显示而已,但是威胁不了服务器的安全。
SpringBoot如何验证用户上传的图片资源相关推荐
- springboot用户上传头像
用户上传头像流程 1.图片上传至服务器 @PostMapping("upload") public String uploadHeader(MultipartFile header ...
- SpringBoot+MongoDB GridFS文件上传、下载、预览实战
SpringBoot + MongoDB GridFS 随着web 3.0的兴起,数据的形式不局限于文字,还有语音.视频.图片等.高效存储与检索二进制数据也成为web 3.0必须要考虑的问题.然而这种 ...
- SpringBoot + Vue实现博文上传+展示+博文列表
文章目录 前言 实现效果 博文列表 文章编辑 文章显示 博文列表 前端 后端接口 博文上传 前端 后端 登录验证 博文上传 博文显示 前端 后端 总结 前言 ok,又到了水文时间了,那么今天带来的是这 ...
- springboot文件上传服务器,SpringBoot: 浅谈文件上传和访问的坑 (MultiPartFile)
本次的项目环境为 SpringBoot 2.0.4, JDK8.0. 服务器环境为CentOS7.0, Nginx的忘了版本. 前言 SpringBoot使用MultiPartFile接收来自表单的f ...
- Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能
Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSD ...
- 用户上传头像以及BUG修改
持久层 1.sql语句的规划 上传文件的操作其实是:先将用户上传的文件保存到服务器端的某个位置,然后将保存文件的路径记录在数据库中.当后续需要使用该文件时,从数据库中读出文件的路径,即可实现在线访问该 ...
- Springboot + layui + FTP文件上传删除 + HTTP文件下载预览 + pdf.js文件预览(项目实战总结)
文件管理 0.需求及前言 1.前端,上传按钮嵌入数据表格中 2.利用IIS部署FTP文件服务器 3.后台FTP连接和文件操作 4.FTP遇到的问题和解决方案 5.预览PDF文件V1.0:FTP+临时文 ...
- springboot整合amazonS3,封装上传文件接口
之前整理过spring整合amazonS3的博客,也整理过遇到的问题和文档.今天整理下springboot项目下如何使用amazonS3,并且如果是封装接口的话,是怎样的? 1.项目结构 2.在pom ...
- vsftpd匿名用户上传和下载的配置
看到很多朋友配置vsftpd时不能使用匿名用户上传和下载(创建目录或删除.重命名文件夹),本文主要解决vsftpd的匿名用户权限配制问题. 配置要注意三部分,请一一仔细对照: 1.vsftpd.con ...
最新文章
- 【Docker】Docker的三大核心组件
- 智源学术顾问David Harel:经典建模与AI的联姻,如何攻破机器学习的可解释性?| 大师讲座...
- 机器学习:基于关联规则的多标签分类器
- STL源码剖析(四)
- 浏览器兼容--条件样式,选择符前缀,样式属性前缀(转)
- 20170907wdVBA_GetCellsContentToExcel
- 生产性企业CO部分月结流程及系统步骤
- Intel® Nehalem/Westmere架构/微架构/流水线 (1) - 特性概述
- 清屏函数 mysql,mysql中的常用函数总结
- http后面的双斜杠被转义_【实用干货】双荧光素酶报告基因检测
- lanmp_wdcp_v2.4快速安装RPM包发布
- 粒子群算法优化BP和Elman神经网络-matlab源码
- 龙芯ejtag 单步调试pmon
- 汉诺塔问题(看完就记住)
- vtt或srt字幕挂载
- 剑指OFFER思路总结与代码分享——树篇(Java实现)
- “听我说谢谢你”还能用古诗来说?清华搞了个“据意查句”神器,一键搜索你想要的名言警句...
- threeJS导入FBX模型
- 计算机系统的组成一般不包括,计算机系统的基本组成,一般应包括哪些
- Proteus8.12的卸载