news 2026/10/4 2:50:02

苍穹外卖下单业务的漏洞

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
苍穹外卖下单业务的漏洞
问题

苍穹外卖这一块业务,是直接拿购物车的快照去结算,如果在加入购物车之后的时间,商家修改了商品信息,会出现问题。

以下是苍穹外卖下单业务源代码:

package com.sky.service.impl; import com.sky.constant.MessageConstant; import com.sky.context.BaseContext; import com.sky.dto.OrdersSubmitDTO; import com.sky.entity.AddressBook; import com.sky.entity.OrderDetail; import com.sky.entity.Orders; import com.sky.entity.ShoppingCart; import com.sky.exception.AddressBookBusinessException; import com.sky.exception.ShoppingCartBusinessException; import com.sky.mapper.AddressBookMapper; import com.sky.mapper.OrderDetailMapper; import com.sky.mapper.OrderMapper; import com.sky.mapper.ShoppingCartMapper; import com.sky.service.OrderService; import com.sky.vo.OrderSubmitVO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @Service @Slf4j public class OrderServiceImpl implements OrderService { @Autowired private OrderMapper orderMapper; @Autowired private OrderDetailMapper orderDetailMapper; @Autowired private AddressBookMapper addressBookMapper; @Autowired private ShoppingCartMapper shoppingCartMapper; /** * 用户下单 * @param ordersSubmitDTO * @return */ @Override public OrderSubmitVO submit(OrdersSubmitDTO ordersSubmitDTO) { // 判空(地址簿,购物车) AddressBook add = addressBookMapper.getById(ordersSubmitDTO.getAddressBookId()); if(add == null){ throw new AddressBookBusinessException(MessageConstant.ADDRESS_BOOK_IS_NULL); } ShoppingCart shoppingCart = new ShoppingCart(); shoppingCart.setUserId(BaseContext.getCurrentId()); List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart); if(list.isEmpty() || list == null){ throw new ShoppingCartBusinessException(MessageConstant.SHOPPING_CART_IS_NULL); } // 向订单表插入一条订单数据 Orders orders = new Orders(); BeanUtils.copyProperties(ordersSubmitDTO,orders); orders.setOrderTime(LocalDateTime.now()); orders.setPayStatus(Orders.UN_PAID); orders.setStatus(Orders.PENDING_PAYMENT); orders.setNumber(String.valueOf(System.currentTimeMillis())); orders.setPhone(add.getPhone()); orders.setConsignee(add.getConsignee()); orders.setUserId(BaseContext.getCurrentId()); orderMapper.insert(orders); // 向订单明细表批量插入多条数据 List<OrderDetail> detailList = new ArrayList<>(); for (ShoppingCart cart : list) { OrderDetail orderDetail = new OrderDetail(); BeanUtils.copyProperties(cart,orderDetail); orderDetail.setOrderId(orders.getId()); detailList.add(orderDetail); } orderDetailMapper.insertBatch(detailList); // 清空购物车 shoppingCartMapper.clearByUserId(BaseContext.getCurrentId()); // 返回VO OrderSubmitVO orderSubmitVO = OrderSubmitVO.builder() .id(orders.getId()) .orderNumber(orders.getNumber()) .orderAmount(orders.getAmount()) .orderTime(orders.getOrderTime()) .build(); return orderSubmitVO; } }
解决方法

如果商家修改商品信息后直接更改购物车信息,会涉及多表查询,而且如果用户量大的话,处理起来非常的麻烦,那么争对苍穹外卖这个模块,可以在结算的时候再做一次校验:

for (ShoppingCart cartItem : shoppingCartList) { // 1. 查最新的菜品/套餐数据 Dish dish = dishMapper.getById(cartItem.getDishId()); // 2. 检查是否还在售 if (dish.getStatus() == 0) { throw new OrderBusinessException(dish.getName() + " 已下架"); } // 3. 检查价格是否变动 if (!dish.getPrice().equals(cartItem.getAmount())) { // 直接抛异常,提示用户刷新购物车 throw new OrderBusinessException(dish.getName() + " 价格有变动,请重新确认"); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/4 2:43:31

n8n列表分割实战:Split Out节点用法、配置与常见坑全解析

最近在折腾 n8n 工作流的时候&#xff0c;我把大量时间花在了数据结构转换上&#xff0c;尤其是列表分割。n8n 里的 Split Out 节点&#xff0c;就是专门用来把列表拆成单个项目的工具&#xff0c;配合 n8n credentials 配置好数据源之后&#xff0c;你可以在 n8n 工作流里非常…

作者头像 李华
网站建设 2026/10/4 2:40:46

R7FA4M2AD3CFP搭配MR25H40CDF:工业嵌入式存储的MRAM替代方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/4 2:39:34

Codex 安装配置避坑指南:接入 DeepSeek 与常见报错全解析

Codex 这个词最近在开发圈子里刷屏的频率&#xff0c;高到让我有点恍惚。打开任何技术社区&#xff0c;几乎都能看到有人在讨论 Codex 安装、Codex 接入 DeepSeek、Codex 桌面版怎么汉化……但与此同时&#xff0c;也有大量朋友在评论区里说&#xff1a;算了&#xff0c;用不上…

作者头像 李华
网站建设 2026/10/4 2:39:29

WorkBuddy 母版-副本自动同步总控台:VBA 模板批量管理实践

1. 从一堆各自为政的 VBA 模板说起&#xff1a;为什么"母版-副本"这件事值得认真做手里攒了几十份 VBA 模板文档&#xff0c;这在做报表自动化、批量出图、数据清洗的人眼里太常见了。一开始都是"这个场景写一份、那个场景改一份"&#xff0c;时间一长&…

作者头像 李华