系统拿到手,功能能跑,一般就开始点页面、打接口。其实还可以直接对着代码扫 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

  1. JWT 密钥 + Session 密钥双弱默认值auth.py:19config.py:30app.py:56),默认值都是 your-secret-key-change-in-production,可伪造任意身份
  2. 默认管理员弱口令app.py:71-80),启动自动建 admin 账号,口令硬编码
  3. 售后模块 IDOR 全面失守after_sale_service.py),列表不过滤、详情不校验、处理接口能改退款金额
  4. 普通下单不扣库存app.py:1067),只查不扣,直接超卖
  5. 库存管控整体失效,普通下单+新版秒杀都不扣真实库存,Product.stock 在销售链路里几乎不动
  6. 移动加权平均成本计算顺序错误purchase_service.py:292),先加库存再算成本,分母多算,每次入库成本都错且累积
  7. 测试初始化后门 + 调试接口泄露app.py:2010app.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 给过没有?

上面只放了骨架。完整那份提示词模板,私信周周回复关键字「扫代码提示词模板」就能拿到。

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐