上传文件校验

本文探讨了防止用户上传病毒文件至服务器的校验方法,包括基础的文件后缀校验,确保上传文件的contentType与后缀匹配,以及针对图片上传的额外校验,以防止跨域攻击。通过ImageIO读取文件和添加水印等方式增强图片安全性。这些措施能有效提升上传文件的安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了防止一些用户将一些病毒文件上传到服务器,我们一般需要对上传的文件做合法性校验, 当时有时候简单的后缀和contentType校验任然还有风险,下面我们一起来讨论一下上传的文件需要做哪些合法性校验。

 

1、文件后缀校验

这层校验应该说是最基本的校验了,我们不能允许用户上传一些exe、jsp、php、asp、html等可执行的文件。

 

2、contentType校验

contentType是内容类型,它会告诉浏览器用什么形式、什么编码来读取这个文件。因此文件后缀和contentType有一个对应关系,上传文件的后缀和contentType应该是对应的,如果不对应则上传信息已被篡改。后缀和contentType关系表参考tomcat下conf/web.xml中。

 

3、上传图片校验

如果需要上传的文件是图片,必须对上传的文件是否是一个图片进行检验,否则如果用户将一个html文件修改后缀为图片并上传,在显示该图片时就会执行html文件中的内容,带来跨域攻击风险。

 

图片校验方式

(1)、通过ImageIO读取文件,如果抛出异常或者读取后的对象为null,表示该文件不是图片

 

/**
	 * 通过读取文件信息判断文件是否是图片
	 * @param imageFile
	 * @return
	 */
	public static boolean checkImageFileByRead(File imageFile){
		try {
			BufferedImage image = ImageIO.read(imageFile);
			if(image == null){
				log.error("The file could not be opened , it is not an image");
				return false;
			}
		} catch (IOException e) {
			log.error(e.getMessage(), e);
			return false;
		}
		return true;
	}

 

(2)、通过ImageIO读取文件成图片流,如果抛出异常或者读取后的流对象为null,表示文件不是图片

/**
	 * 通过将文件转换为图片流方式监测文件是否为图片
	 * @param imageFile
	 * @return
	 */
	public static boolean checkImageFileByIS(File imageFile){
		try {
			ImageInp
Element UI 提供了一个非常强大的组件库,其中 `el-upload` 组件用于文件上传功能。为了实现文件格式的校验,我们可以结合它的 `before-upload` 钩子函数来进行自定义验证。 --- ### 示例代码 ```vue <template> <div> <!-- el-upload 组件 --> <el-upload action="https://jsonplaceholder.typicode.com/posts/" :before-upload="handleBeforeUpload" multiple > <el-button type="primary">点击上传</el-button> </el-upload> </div> </template> <script> export default { methods: { handleBeforeUpload(file) { // 定义允许的文件类型 const allowedTypes = ["image/jpeg", "image/png"]; // 判断文件 MIME 类型是否符合要求 if (!allowedTypes.includes(file.type)) { this.$message.error("仅支持 JPEG 或 PNG 格式的图片!"); return false; // 返回false阻止继续上传流程 } // 还可以根据需要增加文件大小限制等其他校验逻辑 return true; // 允许上传 }, }, }; </script> ``` --- ### 功能解析 1. **`action`:** 表示文件提交的目标 URL 地址。 2. **`before-upload`:** 在上传之前会触发该钩子函数,返回值如果是 `true`,则正常上传;如果返回 `false`、Promise.reject() 或者抛出错误,则会中断上传过程。 3. **核心逻辑:** - 我们通过 `file.type` 获取到当前文件的实际 MIME 类型; - 将其预设的支持类型数组对比,如果不匹配就提示用户并终止上传。 4. **弹窗提醒:** Element Plus 内置了消息通知工具 `$message.error()` 来展示友好信息给用户知道哪里出了错。 --- ### 注意事项 - 虽然可以在前端完成初步检测,但永远不要忽略后端的安全性检查。前端很容易被绕过,因此服务端也应当再次核实所有接收到的数据无误后再保存至数据库或磁盘。 - 对于某些特殊需求如压缩包解压后的结构分析这类复杂任务更适合交给后台执行而非单纯依赖客户端脚本解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值