项目代码优化(1)——下单逻辑

给一个电商开发的系统排查,发现漏洞很多。很多经验不够的开发者很容易忽视的逻辑错误陷阱。在给一个项目做二次开发时候,检测到的相关经典案例。这里整理支付和产品相关的逻辑,方便后续查看。,这里进行一些简单的逻辑漏洞梳理与修复。

这里基本可以看出经验少的程序员和有经验的程序员的差距,这种差距与算法能力无关,只与类似的系统设计经验有关,所以如果不是算法岗,盲目追逐算法,并不是最佳解。如果仅仅是以完成功能和对外展示流程走通为核心目标,代码逻辑质量看不出来,但是到真正运行的时候,有经验和无经验写的代码差距巨大。

1.原来逻辑与想法::
根据优惠券id,读取根据id状态下未使用的优惠券,进入下一步逻辑。
查询条件 id = $coupon_id + status = 0 读取一个未使用的优惠券。因为优惠券id是唯一的,再读取未使用的优惠券,俩个状态都符合,肯定表示该优惠券是可以使用的。

诊断风险:,读取优惠券之前,必须加上身份限定user_id 也就是需要三方条件成立,这张查询条件才是有效的。虽然大部分正常情况下,俩者查询结果一致,但是如果有恶意攻击者,从A账户,获取到了B账户的优惠券,这样就可以根据B的优惠券id 放入A账户使用。很显然,id = $coupon_id  and  user_id  and status =0  查询安全性上明显高一截,当然另外的写法是全部读取出来,然后用业务代码判断,这会增加业务逻辑代码复杂度。


2.原始写这个系统人代码逻辑:
读取一个product_id 然后进行一次检查,又读取另外一个package_id 又进行一次检查,如果没有检测到相关信息,报错。每次读取一个参数,判断一次,不行,退出报错,没有问题。方便理解。

代码风险: 不是统一先验证必填参数的空参,就直接先读取数据库,如果后面又必填的参数是空参,会导致前面的查询都是浪费。成熟的写法,都是先对所有的必填参数进行验证,出现必填的空参,直接报错,让客户端传递完整参数。可以节约性能。

3.原始写法:API接口直接完成全部逻辑,就是一个接口逻辑从头写到尾,除了使用了内部Model封装的CRUD小方法,其他逻辑全部堆积到一个主方法里面,导致下单方法长度超过300行。

诊断风险: 大方法里面包含 优惠券使用逻辑,拼单逻辑,产品判断逻辑,下单的判断逻辑,产品的规则逻辑,要测试里面任意逻辑,都只能跑全部的方法,导致修改调试逻辑,只能跑整个方法,而整个方法,又因为参数过多,导致调试的效率大幅度降低。

改进方法: 将优惠券逻辑 结算逻辑  产品判断逻辑,规则逻辑 ,权限判断逻辑,全部拆开到model里面或者子方法里面,调试的时候,只需要填入我们要调试的基础逻辑即可,不需要跑其他已经正确的逻辑。

4.API 没有任何防刷,面对并发没有任何防御措施。一旦出现需要连续快速下单的情况,会造成用户可以使用俩次优惠券。查询的接口对防刷没有太高要求,但是对于数据有改动,账户金额有变动/优惠券有数量限制的 ,没有并发,基本就会被灰产使用。写该方法的人,应该没有被灰产攻击的经验,没有代码上有这种防御接口。

改进方法:其实主要还是防止用户网络不畅,连续点了俩次的情况出现。新增一个订单锁,确定该订单下单逻辑全部走完之后,才能下第二单。也就是增加一个流程锁,每个用户在一个时间只能下一单,防止用户的优惠和余额关键信息被同时改动,导致数据失效。一般普通流程锁,使用redis的set即可完成,如果是存在更高级的并发的,需要使用到setnx 。流程锁需要注意的问题是,在执行完成全部逻辑后,需要进行对应解锁。所以最好的执行方法就是,controllerl里面只操作参数判断+锁流程+主流程,而流程放到logic层或者model层。

5.当前的写法:没有产品和店铺的salesnum字段,需要的时候,直接采用 count的方法读取数据库,简单方便,实时读取数据库。很多新手设计表的时候,特别喜欢使用count来替代统计功能,方便好用,也容易理解。

风险警示:一旦遇到诸如需要后台统计每个产品的销量还有,每个店铺的销售量的时候,只能循环使用count,对系统的性能是噩梦,特别是当订单数量达到一百万的时候,会发现刷下后台,就会导致整个系统卡死。

改进方法:对全部需要统计的东西,尽量额外增加一个count_num字段,在进行改动的时候对该字段进行+1  或者-1  如果对精确度要求不高,就不使用事物。否则就需要事物来控制准确度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/42774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 22.04 LTS 上安装 MySQL8.0.23(在线安装)

目录 在线安装MySQL 步骤1:更新软件包列表 步骤2:安装MySQL服务器 步骤3:启动MySQL服务 步骤4:检查MySQL状态 步骤5:修改密码、权限 在线安装MySQL 步骤1:更新软件包列表 在进行任何软件安装之前&a…

p9函数(1)

int Add(int x,int y) { int z0; zxy; return z; } int main() { int a10; int b20; int sumAdd(a,b); printf("%d\n",sum); return 0; } 字符串求长度 int main() { char arr1[]"bit"; char arr2[20]"###…

移动UI: 什么特征会被认为是简洁风格,用案例告诉你

什么是简洁风格,恐怕一百个人有一百个是理解,本文通过理论分析案例的方式进行探讨。 移动 UI 中的简洁风格通常具有以下几个特征: 1. 平面化设计: 简洁风格的移动 UI 善于运用平面化设计,即去除过多的阴影、渐变和立…

水冷液冷负载系统的六种基本类型

您可以选择六种基本类型的冷却系统,以满足负载的冷却需求。每个人都有其优点和缺点。本文旨在识别不同类型的冷却系统并确定它们的优缺点,以便您可以根据自己的需求做出明智的选择。 液体冷却系统有六种基本类型: 1.液对液 2.闭环干燥系统…

深度讲解 UUID/GUID 的结构、原理以及生成机制

目录 一. 前言 二. 被广泛使用 三. UUID 的结构 3.1. 必须了解的 3.2. 十六进制数字字符(hexDigit) 3.3. UUID 基本结构 3.4. 类型(变体)和保留位 3.5. 版本(子类型) 3.6. 时间戳 3.7. 时钟序列 …

管理《欧盟数字服务法》交易者要求

《数字服务法》合规性 根据《数字服务法》(DSA) 的要求,对于在欧盟地区 (EU) 通过 App Store 分发 App 的所有交易商,Apple 需要验证并显示其联系信息。请指明你是否将以交易商或非交易商的身份在欧盟地区分发任何内容。进一步了解你是否应为交易商。 …

[激光原理与应用-101]:南京科耐激光-激光焊接-焊中检测-智能制程监测系统IPM介绍 - 5 - 3C行业应用 - 电子布局类型

目录 前言: 一、激光在3C行业的应用概述 1.1 概述 1.2 激光焊接在3C-电子行业应用 二、3C电子行业中激光焊接 2.1 纽扣电池 2.2 均温板 2.3 指纹识别器 2.4 摄像头模组 2.5 IC芯片切割 三、3C行业中激光切割 四、激光在3C行业中的其他应用 4.1 涂层去除…

Golang | Leetcode Golang题解之第222题完全二叉树的节点个数

题目&#xff1a; 题解&#xff1a; func countNodes(root *TreeNode) int {if root nil {return 0}level : 0for node : root; node.Left ! nil; node node.Left {level}return sort.Search(1<<(level1), func(k int) bool {if k < 1<<level {return false}…

ubuntu22.04+pytorch2.3安装PyG图神经网络库

ubuntu下安装torch-geometric库&#xff0c;图神经网络 开发环境 ubuntu22.04 conda 24.5.0 python 3.9 pytorch 2.0.1 cuda 11.8 pyg的安装网上教程流传着许多安装方式&#xff0c;这些安装方式主要是&#xff1a;预先安装好pyg的依赖库&#xff0c;这些依赖库需要对应上pyth…

【Dison夏令营 Day 12】如何用 Python 构建数独游戏

通过本综合教程&#xff0c;学习如何使用 Pygame 在 Python 中创建自己的数独游戏。本指南涵盖安装、游戏逻辑、用户界面和计时器功能&#xff0c;是希望创建功能性和可扩展性数独益智游戏的爱好者的理想之选。 数独是一种经典的数字谜题&#xff0c;多年来一直吸引着谜题爱好…

昇思MindSpore25天学习Day19:CycleGAN图像风格迁移互换

(TOC)[CycleGAN图像风格迁移呼唤] 模型介绍 模型简介 CycleGAN(Cycle Generative Adversaial Network)即循环对抗生成网络&#xff0c;来自论文Link:Unpaired lmage-to-mage Translation using Cycle-Consistent AdvesairalNetworks该模型实现了—种在没有配对示例的情况下学…

从nginx返回404来看http1.0和http1.1的区别

序言 什么样的人可以称之为有智慧的人呢&#xff1f;如果下一个定义&#xff0c;你会如何来定义&#xff1f; 所谓智慧&#xff0c;就是能区分自己能改变的部分&#xff0c;自己无法改变的部分&#xff0c;努力去做自己能改变的&#xff0c;而不要天天想着那些无法改变的东西&a…

麒麟桌面操作系统上网络设置界面消失的解决方法

原文链接&#xff1a;麒麟桌面操作系统上网络设置界面消失的解决方法 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于麒麟桌面操作系统上网络设置界面消失解决方法的文章。在使用麒麟桌面操作系统时&#xff0c;可能会遇到网络设置界面突然消失的情况&#xff…

斯坦福CS224n深度学习培训营课程

自然语言处理领域的经典课程涵盖了从基础知识到最新研究的全面内容。本培训营将精选课程内容&#xff0c;结合实际案例和项目实践&#xff0c;带领学员深入探索自然语言处理的前沿&#xff0c;学习最先进的深度学习技术。 课程大小&#xff1a;2.6G 课程下载&#xff1a;http…

四自由度SCARA机器人的运动学和动力学matlab建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 针对SCARA 机器人系统进行了深入研究与探讨&#xff0c;提出SCARA机器人的动力学模型和运动学模型&#xff0c;并以MATLAB软件为仿真平台&#xff0c;通过MATLAB Robotics Too…

java核心-泛型

目录 概述什么是泛型分类泛型类泛型接口泛型方法 泛型通配符分类 泛型类型擦除分类无限制类型擦除有限制类型擦除 问题需求第一种第二种 概述 了解泛型有利于学习 jdk 、中间件的源码&#xff0c;提升代码抽象能力&#xff0c;封装通用性更强的组件。 什么是泛型 在定义类、接…

二手闲置平台小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;卖家管理&#xff0c;商品分类管理&#xff0c;商品信息管理&#xff0c;商品购买管理&#xff0c;商品配送管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;商品信息&a…

【linux服务器】大语言模型实战教程:LLMS大模型部署到个人服务器或嵌入式开发板(保姆级教学)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 说到大语言模型相信大家都不会陌生&#xff0c;大型语言模型(LLMs)是人工智能文本处理的主要类型,也现在最流行的人工智能…

基于Java+SpringMvc+Vue技术智慧校园系统设计与实现--60页及以上论文参考

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…

网络基础:园区网络架构

园区网络 园区网络&#xff08;Campus Network&#xff09;是指在一个相对较大的区域内&#xff0c;如大学校园、企业园区或政府机关等&#xff0c;建立的计算机网络系统。园区网络根据规模的不同&#xff0c;可以分为以下几种类型&#xff1a; ①小型园区网络&#xff1a;通常…