【代码审查提示词模板】vibe coding 出来的电商系统,AI 审出 7 个 P0,其中 4 个接口还在返回成功
系统拿到手,功能能跑,一般就开始点页面、打接口。其实还可以直接对着代码扫 bug。
我拿自己 vibe coding 糊的一个电商系统试了一遍:秒杀、进销存、会员积分、售后,Flask + SQLAlchemy + MySQL + Redis,主路由两千多行,七个业务 Service,二十来张表。跟它说「加个售后模块」,模块就出来了;说「秒杀防超卖,上 Redis 原子扣减」,Lua 脚本也贴上了。点哪里都能跑。
你跟它说「加个下单」,它不会主动想库存扣不扣、事务包不包、并发防不防。所以功能能跑,不代表能上线。我让 AI 按破坏性思路对着这堆代码审,四批扫完,52 个问题,7 个 P0。7 个里有 4 个,接口还在返回成功。
很多人审代码就丢一句「帮我审查这个项目」。方向它只能猜,扫出来经常是「建议补充注释」。我没这么干。扫之前先把需求整理成一张菜单喂进去,大概是这种:
【认证】注册/登录/登出/图形验证码+滑块验证/JWT+Session 双模式
【商品】列表/详情/创建/更新/软删除/库存汇总
【秒杀】活动管理→商品配置→预热库存→下单(Lua扣减+分布式锁+限购+幂等)
【订单】普通/秒杀;pending→paid→shipped→completed/cancelled
【采购】供应商→采购订单→入库单→确认入库(增库存+移动加权平均+记账)
【销售】客户→销售订单→出库单→确认出库(减库存+两笔凭证)
【库存】流水/调整/汇总/移动加权平均成本
【财务】科目/凭证/科目余额/利润表/资产负债表
【会员积分】5级会员/积分获取消耗/签到/专享商品/排行榜
【售后】退货/换货/仅退款;多状态机流转
有这张表,它扫一个函数会去追上下游。扫到「确认采购入库」时,它问:需求写了入库要自动生成凭证(借库存商品/贷应付账款),这里调了吗?没调。generate_purchase_voucher 躺在 finance_service.py 里,没有任何业务函数调用它。
菜单之外,提示词里还写了越权、并发、财务精度、状态机、事务、假绿这些角度,以及每个问题必须带文件、行号、事故场景、修复方案。完整九条在文末骨架里。
一次扫全站效果很差。AI 会默认「这接口已经鉴权了」,埋头看业务。后面发现鉴权是漏的,前面等于白扫。我的顺序是先认证和越权,再秒杀/订单/财务/库存,再采购销售,再会员售后。
第 0 批就挖出四个 P0。auth.py 里 JWT_SECRET_KEY 和 Flask 的 SECRET_KEY 都写了弱默认值,os.getenv(..., 'your-secret-key-change-in-production')。部署时没设环境变量,用这串默认密钥就能伪造任意用户的 JWT 和 Session。启动时还自动建了一个弱口令管理员。认证没堵住,后面那些业务问题都是在「假设门是关的」前提下得出来的。
扫接口我让它每个对外 handler 填四格:H 主路径、X 负例、E 边界、S 安全。缺一格就报漏拦。售后处理接口 PUT /api/after-sales/{id}/process,它一开始说挂了登录装饰器,鉴权没问题。我让它填 S 格:普通用户能不能处理别人的售后单?它去查,只挂了 @login_required,没挂 @admin_required,也不校验售后单归属。任意登录用户都能给别人执行退款,金额还是客户端传的。列表接口 GET /api/after-sales 不按 user_id 过滤,姓名、电话、收货地址、退款金额谁登录谁都能看。
还有一类更烦:接口返回成功,数据是假的。我叫它假绿。秒杀下单 200,MySQL 没建单;订单确认成功,下游入库单创建失败被 except: pass 吞了;售后退款成功,库存没回补、财务没记账。提示词里写死了:成功响应必须在 DB/Redis 侧有落点,没有就算假绿。
普通下单就是这么挖出来的。api_create_order 循环检查了 if product.stock < quantity,建单,commit,返回 201。整个函数没有一行 product.stock -= quantity。库存 10 能卖出 100 件。
提示词里我还塞了一条已经踩过的坑:入库单防重是「先查再插」,没有 DB 唯一约束,并发会重复。它顺着这条把同类全翻出来了。SigninRecord(user_id, signin_date) 没唯一约束,并发双击签到会重复发积分;consume_points 先查余额再扣、没加锁,并发抵扣能把积分扣成负数。
四批扫完,52 个问题:7 P0、20 P1、25 P2/P3。
7 个 P0
- JWT 密钥 + Session 密钥双弱默认值(
auth.py:19、config.py:30、app.py:56),默认值都是your-secret-key-change-in-production,可伪造任意身份 - 默认管理员弱口令(
app.py:71-80),启动自动建 admin 账号,口令硬编码 - 售后模块 IDOR 全面失守(
after_sale_service.py),列表不过滤、详情不校验、处理接口能改退款金额 - 普通下单不扣库存(
app.py:1067),只查不扣,直接超卖 - 库存管控整体失效,普通下单+新版秒杀都不扣真实库存,
Product.stock在销售链路里几乎不动 - 移动加权平均成本计算顺序错误(
purchase_service.py:292),先加库存再算成本,分母多算,每次入库成本都错且累积 - 测试初始化后门 + 调试接口泄露(
app.py:2010、app.py:124),/api/test/init可重置管理员密码并直接拿 token,/api/debug/headers未登录可读完整 header
7 个里有 4 个功能看着正常,数据是假的。@login_required 只回答「你登录了没」,不问「这数据是不是你的」。记账函数写了没人调、库存字段没人扣,看返回码会全绿。先读再判断再写,高并发下窗口还在。
上面 7 条是我展开写过的。完整清单按当时四批报告的总览表列在下面,分级以报告为准。
第 0 批 认证 + 越权
- P0-1 JWT 密钥弱默认值,可伪造任意身份 Token(
auth.py:19/config.py:30) - P0-2 Flask SECRET_KEY 弱默认值,可伪造 Session 绕过鉴权(
app.py:56) - P0-3 默认 admin 账号弱口令 admin123(
app.py:71-80) - P0-4 售后模块 IDOR 全面失守(
after_sale_service.py) - P1-1
/api/debug/headers无鉴权泄露内部 header(app.py:124-131) - P1-2
/api/test/init后门可重置 admin 密码(app.py:2010-2063) - P1-3 logout 不吊销 Token,登出后仍有效(
app.py:280-284) - P1-4 Session 通道绕过 JWT 过期/禁用校验(
auth.py:117-123) - P2-1 注册无验证码、可枚举用户名、无密码强度校验(
app.py:169-191) - P2-2 滑块验证可绕过,客户端传 ratio 即过(
captcha_service.py:225-242) - P2-3 验证码 debug 模式泄露答案(
captcha_service.py:261-270) - P2-4 admin 无法查看所有订单,与需求口径不一致(
app.py:1150-1168) - P3-1
/api-docs、/openapi.yaml无鉴权暴露 API 全貌(app.py:134-157) - P3-2 验证码回落进程内字典,多 worker 不共享(
captcha_service.py:21-57) - P3-3 正常下单不扣库存(属第 1 批,此处先记)(
app.py:1067-1147)
第 1 批 秒杀 + 订单 + 财务 + 库存
- P0-1 普通下单只查库存不扣库存,超卖(
app.py:1067-1147) - P0-2 库存管控整体失效,普通不扣 + 秒杀不扣真实库存(跨模块)
- P1-1 新版秒杀不扣 Product.stock 真实库存(
seckill_service.py:148) - P1-2 幂等 Token / 限流定义了但未接入主路径(
redis_client.py/seckill_service.py) - P1-3 移动加权平均成本用 float,精度丢失(
finance_service.py:23-47) - P1-4 订单成本估算用魔法数字 0.6(
finance_service.py:399-400) - P1-5 订单创建未调用自动记账(
app.py:1067-1147) - P1-6 库存调整负库存静默归零,两接口口径不一致(
app.py:1980-1982) - P2-1 秒杀限购先扣后查,存在 TOCTOU(
seckill_service.py:59-78) - P2-2 秒杀订单无超时未支付自动取消/回补库存(
seckill_service.py) - P2-3 利润表收入只取贷方,漏红冲(
finance_service.py:691-692) - P2-4 手工凭证借贷平衡容差 0.01,且用 float 比较(
finance_service.py:473) - P2-5 销售税额 float 计算,可能借贷不平(
finance_service.py:244-246) - P2-6 库存流水 business_type 筛选值不一致(
stock_service.py:58-65) - P3-1 decrease_seckill_stock(DECR 版)非原子,已是死代码(
redis_client.py:179-198) - P3-2 atomic_decrease_stock 降级方案非原子(
redis_client.py:427-433) - P3-3 库存汇总漏统计 adjust 类型(
stock_service.py:89-100)
第 2 批 采购 + 销售
- P0-1 移动加权平均成本计算顺序错误,先加库存再算成本(
purchase_service.py:292-301) - P1-1 采购入库确认不自动记账(
purchase_service.py:264-332) - P1-2 销售出库确认不自动记账(
sales_service.py:286-349) - P1-3 防重复创建无 DB 唯一约束,并发下失效(
models.py:395/524) - P1-4 confirm 订单先 commit 再建下游单,下游失败静默吞(
purchase_service.py:168-180) - P1-5 多商品入库/出库非原子,流水独立 commit(
stock_service.py:42) - P2-1 采购/销售金额 float 计算精度(
purchase_service.py:47/sales_service.py:47) - P2-2 供应商/客户 code 并发重复靠 DB 约束,异常未友好处理(
purchase_service.py:16-30)
第 3 批 会员积分 + 售后
- P1-1 签到防重复先查再插,无唯一约束,并发重复发积分(
member_service.py:227) - P1-2 consume_points 并发超扣无锁,可透支成负积分(
member_service.py:130) - P1-3 会员专享商品购买,积分消耗与库存扣减不在同一事务(
member_service.py:431-447) - P1-4 排行榜接口引用不存在的
User.is_active,接口 500(member_service.py:603) - P1-5 售后退款/退货不联动库存与财务(
after_sale_service.py:324-331) - P2-1 earn_points 用
int(points * multiplier),float 截断(member_service.py:77) - P2-2 积分过期功能形同虚设,earn 时不写 expire_at(
member_service.py:637-643) - P2-3 会员专享商品并发购买超卖,先查库存再扣无锁(
member_service.py:424-445) - P2-4 generate_service_no 并发可能生成重复单号(
after_sale_service.py:101-110) - P2-5 启动时插入示例售后数据,会污染生产(
after_sale_service.py:115) - P3-1 signin 多层 commit(
member_service.py:264-276)
骨架
换别的业务系统,骨架可以这么套:
你是一个 15 年经验的资深架构师 + 安全专家。
当前项目是 [一句话说清系统定位],技术栈 [xxx]。
请先根据实际仓库校准技术栈,不要臆造。
审查前,把下面"真实菜单"装进脑子:
[列出系统的模块、接口、状态机]
按以下维度排查:
1. 越权(IDOR/垂直越权/水平越权)
2. 并发正确性(原子性/锁/幂等/限流)
3. 数据与财务正确性(精度/一致性/对账)
4. 状态机(非法迁移/回滚)
5. 事务边界(多步写是否原子)
6. 容错(下游失败是否明确报错)
7. 注入与密钥(硬编码/默认口令/注入)
8. 0-1 特有坑(后门/假数据/吞异常)
9. 对照测试用例扫码(HEXS)
输出要求:
按 P0/P1/P2/P3 分级,每个问题必须有:文件+行号、问题描述、
事故场景推演(可执行的测试步骤)、修复方案。
特别规则:
- 每个接口用 HEXS 四格打勾,缺格报漏拦
- 成功响应必须验证 DB/缓存侧有落点,没有就是假绿
- 已踩过的坑:[列出],同类必须揪出
分批扫描,不要一次扫全站。
第 0 批先扫认证+越权,堵住入口再扫业务。
写的时候我还是让 AI 放飞。上线前会换这套提示词让它审一遍。我是测试员周周。你那份 vibe coding 出来的代码,审的时候菜单和 HEXS 给过没有?
上面只放了骨架。完整那份提示词模板,私信周周回复关键字「扫代码提示词模板」就能拿到。
更多推荐




所有评论(0)