Ver Fonte

fix: 修复订单/地址越权及支付类型绕过漏洞

Co-authored-by: Cursor <cursoragent@cursor.com>
15376779826 há 1 mês atrás
pai
commit
2cde2f6825

+ 24 - 0
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreOrderServiceImpl.java

@@ -417,6 +417,10 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
         if(!Objects.equals(order.getStatus(), OrderInfoEnum.STATUS_0.getValue())){
             return R.error("订单状态不正确");
         }
+        R payTypeError = validateAppPayType(param.getPayType());
+        if (payTypeError != null) {
+            return payTypeError;
+        }
 
         Object isPaying = redisCache.getCacheObject("isPaying:" + param.getOrderId());
         if(ObjectUtil.isNotNull(isPaying)) {
@@ -787,6 +791,12 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
             List<FsStoreCartQueryVO> carts = redisCache.getCacheObject("orderCarts:" + param.getOrderKey());
             //获取地址
             FsUserAddress address=userAddressMapper.selectFsUserAddressById(param.getAddressId());
+            if (address == null) {
+                return R.error("地址不存在");
+            }
+            if (!Objects.equals(address.getUserId(), userId)) {
+                return R.error("非法操作");
+            }
             //检测库存
             //三种特定产品发YDSP001
             int ydspHouse = 0;
@@ -1565,6 +1575,9 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
             //获取地址
             FsUserAddress address=userAddressMapper.selectFsUserAddressById(param.getAddressId());
             Asserts.notNull(address,"当前地址不存在,请检查是否有维护!");
+            if (!Objects.equals(address.getUserId(), uid)) {
+                return R.error("非法操作");
+            }
             //获取套餐数据
             JSONArray jsonArray=JSONUtil.parseArray(storeProductPackage.getProducts());
             List<StorePackageProductDTO> goodsList=JSONUtil.toList(jsonArray,StorePackageProductDTO.class);
@@ -3701,6 +3714,10 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
         if(order.getStatus()!= OrderInfoEnum.STATUS_0.getValue()){
             return R.error("订单状态不正确");
         }
+        R payTypeError = validateAppPayType(param.getPayType());
+        if (payTypeError != null) {
+            return payTypeError;
+        }
 
         String orderId=redisCache.getCacheObject("isPaying:"+order.getId());
         if(StringUtils.isNotEmpty(orderId)&&orderId.equals(order.getId().toString())){
@@ -3878,4 +3895,11 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
         return R.error("无支付类型");
     }
 
+    private R validateAppPayType(Integer payType) {
+        if (Objects.equals(payType, 3)) {
+            return R.error("不支持该支付方式");
+        }
+        return null;
+    }
+
 }

+ 15 - 0
fs-user-app/src/main/java/com/fs/app/controller/AppBaseController.java

@@ -2,6 +2,7 @@ package com.fs.app.controller;
 
 
 import com.fs.app.utils.JwtUtils;
+import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
@@ -34,4 +35,18 @@ public class AppBaseController {
 			return null;
 		}
 	}
+
+	protected boolean isCurrentUser(Long userId) {
+		if (userId == null || StringUtils.isEmpty(getUserId())) {
+			return false;
+		}
+		return userId.equals(Long.parseLong(getUserId()));
+	}
+
+	protected R denyIfNotCurrentUser(Long userId) {
+		if (!isCurrentUser(userId)) {
+			return R.error("非法操作");
+		}
+		return null;
+	}
 }

+ 15 - 1
fs-user-app/src/main/java/com/fs/app/controller/StoreAfterSalesController.java

@@ -42,8 +42,15 @@ public class StoreAfterSalesController extends  AppBaseController {
     @ApiOperation("获取订单项列表")
     @GetMapping("/getMyStoreOrderItemByOrderId")
     public R getMyStoreOrderById(@RequestParam("orderId") Long orderId){
-        List<FsStoreOrderItemVO> list=itemService.selectFsStoreOrderItemListByOrderId(orderId);
         FsStoreOrder order=orderService.selectFsStoreOrderById(orderId);
+        if (order == null) {
+            return R.error("订单不存在");
+        }
+        R denied = denyIfNotCurrentUser(order.getUserId());
+        if (denied != null) {
+            return denied;
+        }
+        List<FsStoreOrderItemVO> list=itemService.selectFsStoreOrderItemListByOrderId(orderId);
         order.setUserPhone(ParseUtils.parsePhone(order.getUserPhone()));
         order.setUserAddress(ParseUtils.parseIdCard(order.getUserAddress()));
         return R.ok().put("order", order).put("items",list);
@@ -87,6 +94,13 @@ public class StoreAfterSalesController extends  AppBaseController {
     @ApiOperation(value = "获取售后详情", notes = "获取售后详情")
     public R getAfterSalesDetails(@RequestParam("salesId") Long id) {
         FsStoreAfterSales sales=storeAfterSalesService.selectFsStoreAfterSalesById(id);
+        if (sales == null) {
+            return R.error("售后单不存在");
+        }
+        R denied = denyIfNotCurrentUser(sales.getUserId());
+        if (denied != null) {
+            return denied;
+        }
         FsStoreAfterSalesItem map=new FsStoreAfterSalesItem();
         map.setStoreAfterSalesId(id);
         List<FsStoreAfterSalesItem>  items=salesItemService.selectFsStoreAfterSalesItemList(map);

+ 78 - 1
fs-user-app/src/main/java/com/fs/app/controller/StoreOrderController.java

@@ -8,6 +8,7 @@ import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
 import com.fs.common.exception.CustomException;
 import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.common.utils.StringUtils;
 import com.fs.store.domain.*;
 import com.fs.store.dto.FsStoreOrderComputeDTO;
 
@@ -80,7 +81,20 @@ public class StoreOrderController extends  AppBaseController {
         if(ObjectUtil.isEmpty(orderId) && ObjectUtil.isEmpty(orderCode)){
             throw new CustomException("订单ID和订单号不能同时为空");
         }
-        return orderService.getMyStoreOrderByIdOrOrderCode(orderId,orderCode);
+        FsStoreOrder order;
+        if (StringUtils.isNotEmpty(orderCode)) {
+            order = orderService.selectFsStoreOrderByOrderCode(orderCode);
+        } else {
+            order = orderService.selectFsStoreOrderById(orderId);
+        }
+        if (order == null) {
+            return R.error("订单不存在");
+        }
+        R denied = denyIfNotCurrentUser(order.getUserId());
+        if (denied != null) {
+            return denied;
+        }
+        return orderService.getMyStoreOrderByIdOrOrderCode(order.getId(), orderCode);
     }
 
     @Login
@@ -88,6 +102,14 @@ public class StoreOrderController extends  AppBaseController {
     @GetMapping("/getStoreOrderById")
     public R getStoreOrderById(@RequestParam("orderId") Long orderId){
         logger.info("开始处理获取订单请求, 订单ID: {}", orderId);
+        FsStoreOrder order = orderService.selectFsStoreOrderById(orderId);
+        if (order == null) {
+            return R.error("订单不存在");
+        }
+        R denied = denyIfNotCurrentUser(order.getUserId());
+        if (denied != null) {
+            return denied;
+        }
         return orderService.getStoreOrderById(orderId);
     }
 
@@ -97,6 +119,16 @@ public class StoreOrderController extends  AppBaseController {
     public R getStoreOrderByIdRemote(@RequestParam(value = "orderId",required = false) Long orderId,
                                      @RequestParam(value = "payCode",required = false) String payCode){
         logger.info("获取订单-轮询获取信息, 订单ID: {}, payCode: {}", orderId,payCode);
+        if (orderId != null) {
+            FsStoreOrder order = orderService.selectFsStoreOrderById(orderId);
+            if (order == null) {
+                return R.error("订单不存在");
+            }
+            R denied = denyIfNotCurrentUser(order.getUserId());
+            if (denied != null) {
+                return denied;
+            }
+        }
         return orderService.getStoreOrderByOrderIdTz(orderId,payCode);
     }
 
@@ -137,6 +169,15 @@ public class StoreOrderController extends  AppBaseController {
         Long orderId = param.getOrderId();
         logger.info("开始处理支付请求, 订单号: {}, 支付类型: {}", orderId, param.getPayType());
 
+        FsStoreOrder order = orderService.selectFsStoreOrderById(orderId);
+        if (order == null) {
+            return R.error("订单不存在");
+        }
+        R denied = denyIfNotCurrentUser(order.getUserId());
+        if (denied != null) {
+            return denied;
+        }
+
         RLock lock = redissonClient.getLock("payment:lock:" + orderId);
         R result = null;
 
@@ -183,6 +224,14 @@ public class StoreOrderController extends  AppBaseController {
     public R editPayType(@Validated @RequestBody FsStoreOrderPayParam param) {
         logger.info("开始处理修改支付类型请求, 参数: {}", param);
 
+        FsStoreOrder order = orderService.selectFsStoreOrderById(param.getOrderId());
+        if (order == null) {
+            return R.error("订单不存在");
+        }
+        R denied = denyIfNotCurrentUser(order.getUserId());
+        if (denied != null) {
+            return denied;
+        }
         return orderService.editPayType(param);
     }
 
@@ -193,6 +242,14 @@ public class StoreOrderController extends  AppBaseController {
     public R payRemain(@Validated @RequestBody FsStoreOrderPayParam param) {
         logger.info("开始处理支付尾款请求, 参数: {}", param);
 
+        FsStoreOrder order = orderService.selectFsStoreOrderById(param.getOrderId());
+        if (order == null) {
+            return R.error("订单不存在");
+        }
+        R denied = denyIfNotCurrentUser(order.getUserId());
+        if (denied != null) {
+            return denied;
+        }
         return orderService.payRemain(param);
     }
 
@@ -252,6 +309,10 @@ public class StoreOrderController extends  AppBaseController {
         if (ObjectUtil.isNull(order)) {
             throw new CustomException("订单不存在");
         }
+        R denied = denyIfNotCurrentUser(order.getUserId());
+        if (denied != null) {
+            return denied;
+        }
         if (order.getStatus() !=0) {
             throw new CustomException("非法操作");
         }
@@ -273,6 +334,10 @@ public class StoreOrderController extends  AppBaseController {
         if (ObjectUtil.isNull(order)) {
             throw new CustomException("订单不存在");
         }
+        R denied = denyIfNotCurrentUser(order.getUserId());
+        if (denied != null) {
+            return denied;
+        }
         if (order.getStatus() <2) {
             throw new CustomException("未发货订单不能查询");
         }
@@ -289,6 +354,10 @@ public class StoreOrderController extends  AppBaseController {
         if (ObjectUtil.isNull(order)) {
             throw new CustomException("订单不存在");
         }
+        R denied = denyIfNotCurrentUser(order.getUserId());
+        if (denied != null) {
+            return denied;
+        }
         if (order.getStatus() <2) {
             throw new CustomException("未发货订单不能查询");
         }
@@ -322,6 +391,14 @@ public class StoreOrderController extends  AppBaseController {
     @ApiOperation("完成订单")
     @PostMapping("/finishOrder")
     public R finishOrder( @Validated @RequestBody FsStoreOrderFinishParam param){
+        FsStoreOrder order = orderService.selectFsStoreOrderById(param.getOrderId());
+        if (order == null) {
+            return R.error("订单不存在");
+        }
+        R denied = denyIfNotCurrentUser(order.getUserId());
+        if (denied != null) {
+            return denied;
+        }
         return orderService.finishOrder(param.getOrderId());
     }