From 628450ded3b738f62f68bc2f7cb90804331eb201 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期二, 18 二月 2025 15:10:59 +0800
Subject: [PATCH] 修复上传文件漏洞

---
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/SignProperties.java                             |   12 ++++++
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/FileController.java                      |   23 +++++++++++
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java                  |   11 +++++
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/MessageUtil.java          |   10 ++++
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java |    5 ++
 5 files changed, 58 insertions(+), 3 deletions(-)

diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/SignProperties.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/SignProperties.java
index bcb77e1..10d2272 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/SignProperties.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/SignProperties.java
@@ -16,6 +16,10 @@
 public class SignProperties {
 	
 	private Boolean enable;
+	/**
+	 * 放行白名单配置,网关不校验此处的白名单
+	 */
+	private List<String> whites = new ArrayList<>();
 	
 	public Boolean getEnable() {
 		return enable;
@@ -24,4 +28,12 @@
 	public void setEnable(Boolean enable) {
 		this.enable = enable;
 	}
+	
+	public List<String> getWhites() {
+		return whites;
+	}
+	
+	public void setWhites(List<String> whites) {
+		this.whites = whites;
+	}
 }
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/FileController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/FileController.java
index 9c04233..4f6954b 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/FileController.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/FileController.java
@@ -1,17 +1,23 @@
 package com.ruoyi.account.controller;
 
+import com.alibaba.fastjson2.util.UUIDUtils;
 import com.ruoyi.account.config.FileUploadConfig;
 import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.security.service.TokenService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.annotation.Resource;
 import java.io.File;
 import java.io.IOException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 文件上传控制类
@@ -26,12 +32,22 @@
 
     @Autowired
     private FileUploadConfig fileUploadConfig;
+    
+    @Resource
+    private TokenService tokenService;
+    
+    @Resource
+    private RedisTemplate redisTemplate;
 
 
 
     @ApiOperation(value = "单文件上传", notes = "单文件上传,rename 默认不重命名")
     @PostMapping(value = "upload", headers = "content-type=multipart/form-data")
     public AjaxResult uploadImageMany(@RequestParam(value = "file") MultipartFile mf) throws IOException {
+        Long userId = tokenService.getLoginUserApplet().getUserId();
+        if(null == userId){
+            return AjaxResult.error("请先登录");
+        }
         if (mf.isEmpty()) {
             return AjaxResult.error("请传入文件!");
         }
@@ -44,18 +60,23 @@
         }
         // 获取文件名称
         String filename = mf.getOriginalFilename();
+        if(filename.contains("../")){
+            filename = filename.replaceAll("\\.\\./", "");
+        }
         // 获取文件后缀
-        String ext = filename.substring(filename.lastIndexOf(".") + 1, filename.length());
+        String ext = filename.substring(filename.lastIndexOf(".") + 1);
         // 检查文件类型
         if (!fileUploadConfig.getAllowExt().contains(ext)) {
             return AjaxResult.error("上传文件格式不正确,仅支持" + fileUploadConfig.getAllowExt());
         }
+        filename = UUID.randomUUID() + "." + ext;
         File targetFile = new File(realPath, filename);//目标文件
         //开始从源文件拷贝到目标文件
         //传图片一步到位
         mf.transferTo(targetFile);
         //拼接数据
         String imgstr = fileUploadConfig.getAccessPath() + TimeDir +"/"+ filename;
+        redisTemplate.opsForValue().set("file:" + userId, filename, 1, TimeUnit.HOURS);
         return AjaxResult.success(imgstr);
     }
 
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
index 5ad844e..5178dc2 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
@@ -52,6 +52,7 @@
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.client.RestTemplate;
@@ -63,6 +64,7 @@
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -120,6 +122,9 @@
     private TAppUserCarService carService;
     @Resource
     private IntegralRuleClient integralRuleClient;
+    
+    @Resource
+    private RedisTemplate redisTemplate;
 
 
     @Resource
@@ -715,6 +720,12 @@
     @GetMapping(value = "/user/set/avatar")
     public R avatar(String url) {
         Long userId = tokenService.getLoginUserApplet().getUserId();
+        String fileName = redisTemplate.opsForValue().get("file:" + userId).toString();
+        String substring = url.substring(url.lastIndexOf("/") + 1);
+        if(StringUtils.isEmpty(fileName) || fileName.equals(substring)){
+            return R.fail("请重新上传头像");
+        }
+    
         TAppUser byId = appUserService.getById(userId);
         byId.setAvatar(url);
         appUserService.updateById(byId);
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/MessageUtil.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/MessageUtil.java
index 267029d..caab60d 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/MessageUtil.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/MessageUtil.java
@@ -7,7 +7,11 @@
 import com.ruoyi.integration.mongodb.service.*;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.concurrent.TimeUnit;
 
 @Slf4j
 @Component
@@ -57,6 +61,8 @@
     private PlatformRemoteUpdateService platformRemoteUpdateService;
     @Autowired
     private QrCodeDeliveryService qrCodeDeliveryService;
+    @Resource
+    private RedisTemplate redisTemplate;
 
     /**
      * 登录认证应答
@@ -76,7 +82,9 @@
      */
     public JSONObject pong(Pong pong){
         log.info("心跳包应答:{}", pong);
-        pongService.create(pong);
+//        pongService.create(pong);
+        //存储缓存中,5分钟有效
+        redisTemplate.opsForValue().set("pong:" + pong.getCharging_pile_code() + pong.getCharging_gun_code(), pong, 5, TimeUnit.MINUTES);
         return  getMessageJsonString(pong, ServiceIdMenu.PONG.getValue());
     }
 
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java
index 4124ed6..045faca 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java
@@ -44,6 +44,7 @@
 import java.util.Date;
 import java.util.Objects;
 import java.util.Set;
+import java.util.concurrent.TimeUnit;
 
 @Slf4j
 @Component
@@ -151,7 +152,9 @@
                 // 持久化消息
                 Ping ping = new Ping();
                 BeanUtils.copyProperties(pingMessage,ping);
-                pingService.create(ping);
+//                pingService.create(ping);
+                //存储缓存中,5分钟有效
+                redisTemplate.opsForValue().set("ping:" + ping.getCharging_pile_code() + ping.getCharging_gun_code(), ping, 5, TimeUnit.MINUTES);
                 
                 UpdateChargingPileStatusVo vo1 = new UpdateChargingPileStatusVo();
                 vo1.setGun_code(pingMessage.getCharging_gun_code());

--
Gitblit v1.7.1