莫方教程网

专业程序员编程教程与实战案例分享

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

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

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

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


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

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

/**
 * 订单类
 */
@RestController
@RequestMapping("/order")
public class OrderController{
@Autowired
private OrderDao;
//创建订单方法
@PostMapping("/create")
public Result 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 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

南京,Nanjing

city

......

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

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

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

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言