我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringBoot中验证用户上传的图片资源的方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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<String> 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<String> 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到了云端,才不管用户上传的图片是不是真正的图片,非法上传,最多导致客户端不能显示而已,但是威胁不了服务器的安全。

原文:https://springboot.io/t/topic/2231

到此这篇关于在SpringBoot中验证用户上传的图片资源的文章就介绍到这了,更多相关SpringBoot验证用户上传的图片资源内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringBoot中验证用户上传的图片资源的方法

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

下载Word文档

猜你喜欢

Android中ImageView使用网络图片资源的方法

本文实例讲述了Android中ImageView使用网络图片资源的方法。分享给大家供大家参考。具体如下: 很多时候我们不想把东西都放在APK里面,或者是不能放进去,这时候我们就需要万能的网路帮助自己实现了 运行效果截图如下:java代码如下
2022-06-06

如何使用PHP进行图片验证码的生成和验证?(PHP生成和验证图片验证码的方法是什么?)

这篇文章介绍了如何使用PHP生成和验证图片验证码。它涉及使用imagecreate()创建画布、imagecolorallocate()设置背景色、substr(md5(uniqid()),0,5)生成随机字符串、imagettftext()绘制字符、imageline()添加干扰线和header("Content-type:image/jpeg")以及imagejpeg($image)输出图像的步骤。验证需要比较用户输入和存储在会话中的验证码。
如何使用PHP进行图片验证码的生成和验证?(PHP生成和验证图片验证码的方法是什么?)
2024-04-02

node.js WEB开发中图片验证码的实现方法

用node做web开发很多都可能碰到需要验证码的地方,之前在github上搜索,有一些比如node-captcha等的类库,都需要依赖第三方的图形处理库或者软件,像我之前安装cario这个图形库时,真是费了好大一番劲,但是其实我们只用到了这
2022-06-04

Python使用PIL库实现验证码图片的方法

本文实例讲述了Python使用PIL库实现验证码图片的方法。分享给大家供大家参考,具体如下: 现在的网页中,为了防止机器人提交表单,图片验证码是很常见的应对手段之一。这里就不详细介绍了,相信大家都遇到过。 现在就给出用Python的PIL库
2022-06-04

在Android开发中替换资源图片不起作用的解决方法

现象 在android开发中,经常会需要替换res\drawable中的图片,打开res\layout下的文件预览布局页面发现图片已经被替换,但在模拟器或者真实机器上运行时发现该图片并没有被替换,还是使用的是原来的资源图片。 原因 在开发过
2022-06-06

node.js中实现kindEditor图片上传功能的方法教程

前言 最近由于工作需要使用在线编辑器,找了几个对比了下KindEditor还是不错的,国产的但文档还是不全,还好能参考官方插件,kindEditor官网上中提供了ASP,ASP.NET,JSP相关的整合应用 可以参照官方文档实现nodejs
2022-06-04

Android使用post方式上传图片到服务器的方法

本文实例讲述了Android使用post方式上传图片到服务器的方法。分享给大家供大家参考,具体如下: public class UploadUtil {private stati
2022-06-06

discuz论坛用户通过邮件验证的设置方法[图文]

这几天发现许多用户遇到邮件发送不了的问题,他们在后台调试时都出现如(邮件发送返回错误信息:)的提示。今天我做了个小测试,在本地进行的。用http://www.cppcns.com户注册完后提示邮件发送成功,但是后来检测没有。后来找到了解决的
2022-06-12

帝国cms用户前台投稿上传图片自动加水印的实现方法

帝国7.0 前台编辑器增加 上传图片编程客栈加水印功能! 我的是最新版 ecms 7.0 utf-8 : 修改 e/class/qinfofun.php 的第1225行 复制代码代码如下:if($type==1)/编程客栈/图片
2022-06-12

xp系统用户无法访问win10电脑上共享资源的解决方法

虽然微软已经发布了win10正式版,但是很多用户因为某些原因仍然无法放弃xp系统。不过,最近有一位XP系统用户反馈想通过局域网访问Windows10电脑上的共享资源,可是遇到了无法正常访问的问题,这是怎么回事呢?下面,就随小编看看该问题的具
2023-05-21

在Django中进行用户注册和邮箱验证的方法

本文主要介绍我在利用Django写文章时,采用的注册方法。首先说一下整体逻辑思路:处理用户注册数据,产生token,生成验证URL,发送验证邮件,用户登录网址,进行验证,验证处理。具体步骤:1、添加用户在Django中自带的User表中,有
2022-06-04

Vue3 使用v-md-editor如何动态上传图片的方法实现

本文主要介绍了Vue3 使用v-md-editor如何动态上传图片,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2022-11-13

Android Socket服务端与客户端用字符串的方式互相传递图片的方法

发送图片:首先找到具体传递的图片:private Bitmap getimage(String sr
2022-06-06

thinkPHP利用ajax异步上传图片并显示、删除的操作方法

这篇文章主要介绍了thinkPHP利用ajax异步上传图片并显示、删除的操作方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。thinkPHP利用ajax异步上传图片并显示、
2023-06-14

tp5使用layui实现多个图片上传(带附件选择)的方法实例

tp5使用layui实现多个图片上传(带附件选择),如何加载layui在此不详细说明,有需要可以百度html代码,主要处理都是在jq中,完成方法全部原创,也许不是最简单的,但也能实现效果
2015-07-25

利用FastReport传递图片参数在报表上展示签名信息的实现方法

这篇文章主要介绍了利用FastReport传递图片参数在报表上展示签名信息,其中主要注意的是,我们传递的图片数据需要采用Base64String的格式才能正常传递和展示,本文通过图文实例代码相结合给大家介绍的非常详细,需要的朋友可以参考下
2022-11-13

小程序从相册获取图片并上传及使用相机拍照功能的方法

今天小编给大家分享一下小程序从相册获取图片并上传及使用相机拍照功能的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.i
2023-06-26

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录