当前位置: 首页 > news >正文

项目开发中安全问题以及解决办法——客户传进来的数据不可信

用户传进来的数据是不可信的,比如下面这种情况下:

@PostMapping("/order") 
public void wrong(@RequestBody Order order) { this.createOrder(order); 
} 
@Data 
public class Order { private long itemId; //商品ID private BigDecimal itemPrice; //商品价格 private int quantity; //商品数量 private BigDecimal itemTotalPrice; //商品总价 
}

如果我们直接利用客户端传过来的数据就很可能导致出现问题,服务端也一定要重新从数据库来初始化商品的价格,重新计算最终的订单价格。如果不这么做的话,很可能会被黑客利用,商品总价被恶意修改为比较低 的价格。

比如改为如下写法:

@PostMapping("/orderRight")
public void right(@RequestBody Order order) {//根据ID重新查询商品Item item = Db.getItem(order.getItemId());//客户端传入的和服务端查询到的商品单价不匹配的时候,给予友好提示if (!order.getItemPrice().equals(item.getItemPrice())) {throw new RuntimeException("您选购的商品价格有变化,请重新下单");}//重新设置商品单价order.setItemPrice(item.getItemPrice());//重新计算商品总价BigDecimal totalPrice = item.getItemPrice().multiply(BigDecimal.valueOf(order.getQuantity()));//客户端传入的和服务端查询到的商品总价不匹配的时候,给予友好提示if (order.getItemTotalPrice().compareTo(totalPrice)!=0) {throw new RuntimeException("您选购的商品总价有变化,请重新下单");}//重新设置商品总价order.setItemTotalPrice(totalPrice);createOrder(order);
}

一种可行的做法是,让客户端仅传入需要的数据给服务端,像这样重新定义一个 POJO CreateOrderRequest 作为接口入参,比直接使用领域模型 Order 更合 理。在设计接口时,我们会思考哪些数据需要客户端提供,而不是把一个大而全的对象作为参数提供给服务端,以避免因为忘记在服务端重置客户端数据 而导致的安全问题。 推荐写法:

@Data
public class CreateOrderRequest {private long itemId; //商品IDprivate int quantity; //商品数量
}
@PostMapping("orderRight2")
public Order right2(@RequestBody CreateOrderRequest createOrderRequest) {//商品ID和商品数量是可信的没问题,其他数据需要由服务端计算Item item = Db.getItem(createOrderRequest.getItemId());Order order = new Order();order.setItemPrice(item.getItemPrice());order.setItemTotalPrice(item.getItemPrice().multiply(BigDecimal.valueOf(order.getQuantity())));createOrder(order);return order;
}

http://www.lryc.cn/news/283417.html

相关文章:

  • 解决springboot启动报Failed to start bean ‘subProtocolWebSocketHandler‘;
  • 什么是技术架构?架构和框架之间的区别是什么?怎样去做好架构设计?(一)
  • 【多线程】认识Thread类及其常用方法
  • 多用户商业版 whisper 2.1在线搭建教程
  • HEXO搭建个人博客
  • Spring MVC学习之——RequestMapping注解
  • 鸿蒙原生应用/元服务开发-延迟任务开发实现(二)
  • 机器学习在什么场景下最常用-九五小庞
  • 利用IP应用场景API识别真实用户
  • Hugging Face怎么通过国内镜像去进行模型下载(hf-mirror.com)
  • POKT Network 开启周期性通缩,该计划将持续至 2025 年
  • LRU Cache
  • 软件测试面试题整理
  • C++三剑客之std::variant(二):深入剖析
  • 实验一 安装和使用Oracle数据库
  • 软件工程研究生后期总结
  • Java爬虫爬取图片壁纸
  • 红队打靶练习:HOLYNIX: V1
  • elasticsearch[二]-DSL查询语法:全文检索、精准查询(term/range)、地理坐标查询(矩阵、范围)、复合查询(相关性算法)、布尔查询
  • Microsoft Word 设置底纹
  • 【大数据】Flink 详解(九):SQL 篇 Ⅱ
  • workflow源码解析:GoTask
  • SpringMVC入门案例
  • Docker本地私有仓库搭建配置指导
  • python 通过定时任务执行pytest case
  • 算法面试题:合并两个有序链表
  • LaWGPT安装和使用教程的复现版本【细节满满】
  • 西门子博途用SCL语言写的入栈出栈
  • 密码产品推介 | 沃通安全电子签章系统(ES-1)
  • 蓝桥杯真题(Python)每日练Day1