日常开发踩坑:前端数据并不可信
作者:互联网
作者 | 浩说编程
来源 | 公众号:浩说编程
[ 大厂技术资源 | 研发必备安装包 | 限时免费获取 ]
在我们的日常业务开发中,和前端的数据交互是必不可少的,通常前端会将参数以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 | 南京,Nanjing | city |
...... |
对于这种情况,建议读者接到前端的选择数据后仍要校验一下数据是否是合法的,可以通过KEY校验,防止非法用户绕过浏览器页面通过工具恶意攻击。
以上就是“前端数据问题”踩过的坑以及脱坑建议,这些坑点都是真实发生过生产事故的案例,希望读者有所警觉。
作者 | 浩说编程
来源 | 公众号:浩说编程
[ 大厂技术资源 | 研发必备安装包 | 限时免费获取 ]
标签:总价,OrderDao,前端,浩说,开发,日常,orderReqVo,public 来源: https://blog.csdn.net/weixin_42028840/article/details/118487367