其他分享
首页 > 其他分享> > 日常开发踩坑:前端数据并不可信

日常开发踩坑:前端数据并不可信

作者:互联网

作者 | 浩说编程
来源 | 公众号:浩说编程
[ 大厂技术资源 | 研发必备安装包 | 限时免费获取 ]

在这里插入图片描述

在我们的日常业务开发中,和前端的数据交互是必不可少的,通常前端会将参数以json格式发送至后端进行逻辑处理,但是前端传来的数据真的可以直接拿来用吗?

本篇就针对这里的几个坑点为读者做科普和预警。

 

一、前端的计算结果不能直接使用

在实际业务开发中,为了提高效率经常发生的情况是:对于一些运算直接在前端处理,然后把计算的结果传给后端,这个时候可能会有读者这么做:

/**
 * 订单类
 */
@RestController
@RequestMapping("/order")
public class OrderController{
@Autowired
private OrderDao;
//创建订单方法
@PostMapping("/create")
public Result<OrderResVo> createOrder(@RequestBody OrderReqVo orderReqVo){
  //直接拿前端的数据存DB
  OrderDao.insertOrder(orderReqVo);
}

OrderReqVo说明:

图片
存在的问题:由于前端的开放性使得订单的总价字段有被恶意篡改的风险,如果金额被该成很低的价格,后果非常严重,之前亲身经历过由于这个问题导致的生产事故,请读者务必谨慎。

改进的思路:通过入参中的商品id查库,根据数据库返回的单价重新计算总价,并与前端传来的总价做对比,不一致则返回提示信息,一致则正常插入数据库

/**
 * 订单类
 */
@RestController
@RequestMapping("/order")
public class OrderController{
@Autowired
private OrderDao orderDao;
@Autowired
private GoodsDao goodsDao;
//创建订单方法
@PostMapping("/create")
public Result<OrderResVo> createOrder(@RequestBody OrderReqVo orderReqVo){
  //根据商品id查库获取商品单价
  GoodsResVo goodsResVo = goodsDao.getGoodsById(orderReqVo.getGoodsId());
  //计算总价
  BigDecimal totalPrice = goodsResVo.getUnitPrice().multiply(new BigDecimal(orderReqVo.getGoodsNumber()));
  //对比前端传来的总价
  if(totalPrice.compareTo(orderReqVo.getTotalPrice()) == 0){
    //即便正确也建议存后台计算的值
    orderReqVo.setTotalPrice(totalPrice);
    OrderDao.insertOrder(orderReqVo);
  }else{
    return Result.error(-1,"商品总价计算异常");
  }
}

 

二、校验下拉列表选项中可能出现的非法值

在前端经常会出现下拉列表控件,其列表值通过从后端获取,用户在选择之后再传给后端:
图片

 可能的码表结构:
KEY
VALUE
TYPE
1
 北京,Beijing
 city
 2
 上海,Shanghai
 city
 3
 南京,Nanjingcity
......

对于这种情况,建议读者接到前端的选择数据后仍要校验一下数据是否是合法的,可以通过KEY校验,防止非法用户绕过浏览器页面通过工具恶意攻击

以上就是“前端数据问题”踩过的坑以及脱坑建议,这些坑点都是真实发生过生产事故的案例,希望读者有所警觉。

作者 | 浩说编程
来源 | 公众号:浩说编程
[ 大厂技术资源 | 研发必备安装包 | 限时免费获取 ]

标签:总价,OrderDao,前端,浩说,开发,日常,orderReqVo,public
来源: https://blog.csdn.net/weixin_42028840/article/details/118487367