云购商城 · 上线前安全评审答辩

支付回调与重复处理
异常支付通知不得错误变更订单状态

本组负责模块为订单域支付回调处理链。本材料对应课程隔离合成环境, 依据成对验证结果说明各项控制的有效性,并据此提出发布建议。

汇报小组

(成员姓名)

陈述时长

10 分钟 · 不设提问

材料形成时间

2026 年 9 月 14 日至 16 日

陈述框架

陈述框架

十分钟陈述结构与六项必答内容对应关系

0:00 — 1:00 | 1 分钟

一、范围与结论

说明负责模块、评审环境与版本,先提出发布建议

第 3 页

1:00 — 3:00 | 2 分钟

二、风险与控制

说明业务风险、控制落点及本组已完成的动作

第 4—6 页

3:00 — 7:00 | 4 分钟

三、证据展示

展示异常与正常对照结果、业务结果及原始材料位置

第 7—10 页

7:00 — 10:00 | 3 分钟

四、缺口与发布安排

说明未验证事项、补证条件、责任与期限及回退安排

第 11—14 页

序号 答辩要求必答内容 本组说明要点 结论性质 对应页
1负责模块、评审环境与版本订单域支付回调处理链事实说明第 3 页
2最大风险:主体、条件与影响伪造或异常通知变更订单状态已实测第 4 页
3控制执行组件;已完成与仅设计控制落于回调服务,网关不承担业务判定已实测 / 仅设计第 5—6 页
4最强证据:异常处理与正常回归七组成对判据及原始材料位置已实测第 7—10 页
5现有证据不能证明的事项一项判据不成立,另有六项待验证未验证第 11—13 页
6发布建议、补证责任与完成判据满足明确条件后再评审待补证第 14—15 页
第一部分 · 范围与结论

负责模块与发布建议

本组负责支付回调处理链,发布建议为「满足明确条件后再评审」

负责模块与处理链路

支付平台发出异步通知
API 网关请求原样转发
回调服务校验并变更状态
订单数据库状态落库

订单状态由支付通知驱动。本组负责链路中「校验并变更状态」环节,及其依赖的签名密钥获取与部署约束。

评审环境与版本

运行环境课程隔离合成环境;服务仅绑定本机回环地址 127.0.0.1
服务与端口回调服务 127.0.0.1:18102 | 课程服务 127.0.0.1:18080
运行版本Node v22.22.2
材料版本学员实验手册 2026-09-06 版;课程脚本与 Day3 模板未标注版本
本组发布建议 满足明确条件后再评审 三种结论中,本组取中间态。七组成对判据已实测成立;一项判据不成立,源码锚点已定位。补齐该项后可重新评审。

结论依据

  • 判据成立(七组):验签、时间窗、订单存在性、金额一致、事件标识、状态流转、重复处理,均具备异常与正常成对原始输出。
  • 判据不成立(一项):币种一致性判据尚未实现,错误币种与正确币种的响应完全一致,源码锚点位于第 96 行。
  • 本次评审为课堂模拟,不构成生产发布授权;全部结论仅覆盖课程材料。
第二部分 · 风险与控制

风险识别与评审范围

风险主体、触发条件与业务影响

评审对象:订单 1001,应付金额 88 元,币种 CNY,初始状态 PENDING。终态 PAID 表示系统已认定该订单完成收款。

风险一 · 外部伪造

未持有签名密钥者可变更订单状态

伪造一条支付成功通知提交至缺陷路径,订单被置为 PAID。
已实测:缺陷基线返回 200 accepted,订单 1001 变为 PAID。

风险二 · 通知内容失真

通知内容与订单数据不一致

金额、币种、订单号或状态流转与订单数据不符时,通知仍被受理并变更状态。
其余五项已被正确拒绝;币种一项当前未被校验。

风险三 · 重复投递

同一支付事件产生二次业务效果

渠道重试或人为重放同一事件,导致重复记账、重复发货。
已实测:重放被拒绝,订单未发生二次更新。

业务影响

  • 订单状态为资金凭证;错误置为 PAID 将直接产生资金损失与对账差异。
  • 异常通知若未留存拒绝记录,事后无法追溯订单终态的形成原因。

评审范围边界

  • 本材料仅覆盖课程合成环境与课程材料版本,不代表客户生产环境
  • 真实渠道协议、目标集群、生产并发及真实密钥服务均不在本次证据范围内。
第二部分 · 风险与控制

控制落点与责任归属

校验控制应落在回调服务,API 网关仅承担转发职责

支付平台签名并发出通知
API 网关入口策略 · 流量限制 · 原样转发
回调服务验签 → 业务核对 → 更新留痕 → 事件判重
订单数据库状态落库
审计与告警逐次判断留存

API 网关

职责范围

  • 入口策略、流量限制、请求原样转发

职责边界

  • 不承担业务判定:网关不具备订单归属、金额与币种一致性所需上下文
  • 不得改写请求体:验签对象为原始报文,任何改写均导致签名失效

回调服务 · 控制执行方

四道校验,顺序固定

  • 来源可信:验证原始报文签名与时间窗
  • 业务核对:订单存在性、金额、币种、状态流转
  • 更新留痕:逐次判断写入审计记录
  • 事件判重:以事件标识判定重复投递

全部判据均取自订单自身的合同数据,不采信通知中的自述内容。

责任分工

各环节责任角色

控制执行回调服务
转发与入口策略API 网关
签名密钥管理受控秘密服务
部署约束平台运维
成对证据采集测试
责任人(待确定)
第二部分 · 风险与控制

控制落点与责任归属(续)

已完成验证动作与尚未实现的设计项

已完成验证 · 具备原始输出

本组已完成的动作

  • 回调服务七场景实测:伪造基线、坏签名、超出时间窗、未知订单、金额篡改、合法通知、重复通知,逐场景记录 HTTP 状态码、服务端判定码与订单状态。
  • 币种判据成对采集:错误币种与正确币种各执行一次,据以判定差异。
  • 源码静态核查:将校验缺口定位至具体行号,确认其性质为「尚未实现」。
  • 校验点只读推演:在数据库只读情境下沿同一链路作出五项预测,与事实卡逐项对照,不一致项予以保留。
  • 事件判重设计:回调链按事件标识判重;相邻订单写入链另有成对实测(属相邻模块,不作为本模块证据)。

仅完成设计 · 尚未实现

已形成设计、代码未落地

  • 币种一致性校验:源码第 96 行仅有占位注释,第 112 行将请求币种原样透传,未与订单币种作任何比对。
  • 无界重试的退避与熔断:只读推演显示部分服务持续重试,表明退避与熔断仍处于设计阶段,尚未进入实现。
  • 生产环境幂等落库:课程幂等仅在单实例内存中验证,并发场景与唯一约束尚未测试。

本组未对被评审代码作任何改动以影响验证结果。未实现的控制项计入未决边界,不计入恶意验收项。

第三部分 · 证据展示

证据一 · 异常通知处理

七类异常通知均被拒绝,订单状态未发生变更

通知条件 HTTP 服务端判定码 订单 1001 状态 材料位置
伪造回调(缺陷基线,无校验) 200 accepted PAID,状态被变更 场景 1 · [A-1]
签名不匹配 401 bad_signature PENDING,未变更 场景 2 · [A-2]
时间戳超出 ±300s 时间窗 401 timestamp_out_of_window PENDING,未变更 场景 3 · [A-3]
订单不存在(9999) 404 order_not_found PENDING,未变更 场景 4 · [A-4]
金额不一致(1 元 ≠ 应付 88 元) 422 amount_mismatch PENDING,未变更 场景 5 · [A-5]
缺少事件标识 400 missing_event_id PENDING,未变更 [A-6]
非法状态流转(status=CREATED) 422 illegal_status_transition PENDING,未变更 [A-7]

异常通知组执行完毕后,订单 1001 状态为 amount 88 · status PENDING;六次拒绝均未变更订单状态。

首行为课程保留的缺陷基线路径,作为对照起点,用以证明在无校验条件下订单确实会被错误变更。

签名与时间窗属两道独立判据:签名判定通知来源是否可信,时间窗限定历史通知的有效使用范围。

第三部分 · 证据展示

证据二 · 正常业务回归

合法通知正常受理,逐次判断均留存审计记录

正常回归

合法签名通知完整通过

正确签名 · CNY · 金额 88 元 · status=PAID,事件标识 E-REQ04-OK1

HTTP 200 accepted PENDING → PAID

材料位置:Day1/支付结果.txt 场景 6 · [B-1] [B-2]

证据说明

  • 控制具备区分能力,正常业务未被误拦截。
  • 订单状态仅在合法路径上发生 PENDING → PAID,构成业务结果层面的判据。
  • 拒绝与受理共用同一链路、同一密钥与同一订单对象,排除了环境差异的干扰。

更新留痕:审计记录逐条对应

最近八条判定记录(倒序),每次拒绝与受理均留存:

1. E-REQ04-OK1replay_rejected  重复投递被拒绝
2. E-REQ04-OK1accepted     合法通知受理
3. E-REQ04-CREATED → illegal_status_transition
4. — → missing_event_id
5. evt-…07183421 → amount_mismatch
6. evt-…07163164 → order_not_found(订单 9999)
7. — → expired
8. — → bad_signature

材料位置:Day1/支付结果.txt [D] 审计事件

对照缺口:错误币种的同一事件在同一份审计中被记为 accepted未留下拒绝记录

第三部分 · 证据展示

证据三 · 重复事件处理

同一事件重放被拒绝,未产生二次业务效果

首次投递

合法通知正常受理

HTTP 200 accepted

事件标识 E-REQ04-OK1 订单 PENDING → PAID

紧接重放同一事件(不重置订单)

同一事件标识再次投递

HTTP 409 event_replayed

订单仍为 PAID 未发生二次业务更新

判重依据

判重依据为事件标识,与请求次数、时间间隔无关。同一事件标识第二次到达即予拒绝,且不变更状态。

材料位置:Day1/支付结果.txt 场景 7 · [C-1] [C-2]

两类 4xx 的性质区分

  • bad_signature 401,通知来源不可信,于验签阶段拒绝
  • event_replayed 409,通知可信但已处理,于判重阶段拒绝

两者性质不同,记录与陈述中不得合并表述为「因签名失败而拒绝」。

相邻模块旁证

订单写入链接口另有成对实测:首次 201,同参重放 200 且订单标识一致,同键换参 409 idempotency_conflict

该证据来自相邻模块,仅说明判重方法一致,不作为本模块证据

第三部分 · 证据展示

证据四 · 成对判据汇总

各控制项异常路径与正常回归成对验证结果

控制项 异常路径 正常回归 业务结果 材料位置
签名可信签名不匹配 → 401合法签名 → 200拒绝时订单保持 PENDING场景 2 / [B-1]
时间窗超出 ±300s → 401窗口内 → 200拒绝时订单保持 PENDING场景 3 / [B-1]
订单存在性订单 9999 → 404订单 1001 → 200拒绝时订单保持 PENDING场景 4 / [B-1]
金额一致1 元 ≠ 88 元 → 42288 元 → 200拒绝时订单保持 PENDING场景 5 / [B-1]
事件标识缺少标识 → 400携带标识 → 200拒绝时订单保持 PENDING[A-6] / [B-1]
状态流转CREATED → 422PAID → 200拒绝时订单保持 PENDING[A-7] / [B-1]
重复处理同事件重放 → 409首次投递 → 200重放后订单仍为 PAID,无二次更新场景 7 / [C-1][C-2]
币种一致
(判据不成立)
USD → 200(应为 422)CNY → 200两项响应完全一致,订单均变为 PAID主线场景 [S-2][S-3]

材料索引一 · 本组实验记录(路径基准:本组实验记录 目录)

Day1/支付结果.txt     回调服务七场景与币种主线场景
Day2/只读推演.txt     同一链路的只读情境推演
Day3/SEC-01.txt      签名密钥获取与轮换(方案)
Day3/部署准入决定.txt   部署约束与准入结论
Day3/运行结果.txt     课程服务端 8/8 原始输出

材料索引二 · 课程工作簿(路径基准:材料包 / 03-学员材料)

课程模板与检查表-可复现版.xlsx
 Day1-需求清单  REQ-12 需求与验收
 Day2-架构评审  ARCH-03 / ARCH-05
 Day3-API报告   接口级成对结果
 Day3-部署清单  SEC-01 / IMG-01

第四部分 · 缺口与发布安排

证据边界与状态分层

三类证据状态分别记录,不互相升格

已运行 · 课程本地已验证

具备原始输出的项目

  • 回调服务七场景与币种主线成对采集
  • 订单服务端 Day3 场景 8/8
  • 数据与 AI 工具边界 Day4 场景 3/3

边界:仅证明课程合成环境上的行为

静态检查 · 仅有文件材料

已检查文件、未运行

  • SEC-01 密钥获取与轮换,方案待验证
  • IMG-01 镜像来源与摘要,静态检查
  • DEP-01 工作负载控制,静态检查

边界:仅证明设计已写入,不证明运行生效

方案 · 尚未验证

仅有设计意向的项目

  • 币种一致性校验
  • 生产环境幂等落库与并发验证
  • 真实渠道验签联调

边界:不得记为「已通过」

与预期不一致的结论予以保留

  • 只读推演中「持续重试」一项预测为受控、事实为持续重试,该项差异予以保留;其结论为抑制重试尚未实现。
  • 推演中「重复提交」与「告警是否触发」两项为未知,已标注所缺证据类型(业务记录、告警事件),不作推断。

三项易被误读的情形

  • 停止检查返回 FAIL 属预期的停止结果,仅证明服务已停止,不构成安全拒绝
  • 同一场景两次通过仅说明结果可重复,不代表本组已完成代码修复
  • 预检与材料检查全部通过仅对应「环境预检通过」与「模板结构检查通过」,不代表集群或密钥服务已运行
第四部分 · 缺口与发布安排

缺口说明 · 币种一致性判据

错误币种通知与正确币种的响应完全一致

异常路径 · currency = USD(应被拒绝)

HTTP 200   accepted: true
orderId: "1001"  status: "PAID"
eventId: "E-CUR-USD"

订单状态:PENDING → PAID(状态被变更);审计记为 accepted

正常回归 · currency = CNY(应被受理)

HTTP 200   accepted: true
orderId: "1001"  status: "PAID"
eventId: "E-CUR-CNY"

订单状态:PENDING → PAID;审计记为 accepted

差异分析

两项响应的状态码、受理标志、订单号、终态与审计结果逐字段一致,唯一区别为事件标识本身。

据此判定:币种一致性判据当前不成立,该情形属尚未实现,不属实现错误。

源码锚点

:96 // 晚间支付组任务:在此补充
    currency === 'CNY' 校验,
    并将拒绝记录写入 events
:112 currency: input.currency || 'CNY'

第 96 行仅有占位注释;第 112 行将请求币种原样透传,缺省值为 CNY,未作任何比对。

本组对该缺口的处置

  • 状态记为 失败已留证,不记为「已通过」。
  • 仅计入未决边界不计入恶意验收项
  • 未修改被评审源码以改变验证结果。
  • 目标行为:返回 422 currency_mismatch、订单保持 PENDING、审计记录拒绝。
第四部分 · 缺口与发布安排

未验证事项

六项待验证事项及所需补充证据

一 · 真实渠道联调 所缺证据:真实报文与证书

验签算法、字段顺序、证书、密钥协商与重试协议均未与真实渠道对接。

二 · 目标组件与版本 所缺证据:目标组件的运行输出

网关、缓存、集群与运行身份的版本未锁定;课程模板本身未标注版本,配置类结论上限仅为静态检查。

三 · 生产环境幂等 所缺证据:并发与持久化记录

课程幂等仅在单实例内存中验证;写路径幂等键、唯一约束及并发投递表现均未测试。

四 · 无界重试的抑制 所缺证据:故障注入数据

只读推演显示部分服务持续重试,退避与熔断仍处于设计要求阶段,无上限与退避的实测记录。

五 · 真实密钥服务 所缺证据:获取与轮换日志

服务身份机制、权限配置与失败行为、轮换与吊销流程均未验证;现有记录为方案,非运行证据。

六 · 生产审计与告警 所缺证据:审计日志与告警事件

回调服务自身具备审计能力,但生产审计平台日志未取得;告警是否触发在推演中仍为未知。

另有一项流程性事项:邻组交叉复核未执行(本场未安排邻组交换),已在部署准入记录中如实登记,未以自评替代。

第四部分 · 缺口与发布安排

发布建议与补证安排

补齐下列条件后重新评审,未完成不进入生产

编号 补充内容 完成判据 责任角色 期限
P1 回调服务补充币种校验
源码第 96 行
USD 请求返回 422 currency_mismatch、订单保持 PENDING、审计记录拒绝;CNY 请求返回 200 且订单由 PENDING 转为 PAID。两项均须满足。 支付服务后端 (待确定)
P2 真实渠道验签联调 真实渠道的异常通知被拒绝、正常通知完成处理,各留存一条原始报文 支付服务后端 · 渠道对接 (待确定)
P3 生产环境幂等落库 幂等键落于写路径并具备唯一约束;同一事件并发投递仅产生一次业务效果 订单服务后端 (待确定)
P4 重试退避与熔断 故障注入下重试具备上限与退避;恢复后核对无重复订单 调用方服务 · 平台运维 (待确定)
P5 目标环境部署约束 探针、Secret 引用、网络策略、运行身份与真实镜像摘要齐备,并在目标集群验证通过 平台运维 · 研发 (待确定)
P6 生产审计与告警 每次拒绝在生产审计平台可查;告警可与同一事件关联至同一链路 运维 · 研发 (待确定)

责任人姓名与计划日期尚在确认中,本页以待确定占位,未以非实际信息填充。

未完成时的处置

P1 未完成前不进入生产。P1 为硬前置条件:缺少真实镜像摘要或校验判据时,交付对象不得冻结。

发布后出现异常的处置

关闭支付回调入口或回退至上一版本回调处理;保留审计记录与订单状态快照,不改写既有事件记录

结论口径

本次为课堂模拟,不构成生产发布授权。三种结论中本组取中间态:满足明确条件后再评审。

结论

评审结论与材料清单

七组成对判据成立,一项不成立并已留证;建议满足条件后重新评审

已证明事项

验签、时间窗、订单存在性、金额一致、事件标识、状态流转、重复处理共七组,均具备异常路径与正常回归的成对原始输出,业务结果均体现于订单状态。

未证明事项(已如实留证)

币种一致性判据当前不成立:错误币种与正确币种响应逐字段一致。源码锚点位于第 96 行,状态记为「失败已留证」,未记为已通过。

超出本次证据范围的边界

真实渠道、目标组件版本、生产并发、生产审计与告警,均已保留于待验证事项,未升格为「通过」。

材料清单(均可按路径独立打开)

本组实验记录/Day1/支付结果.txt · Day2/只读推演.txt · Day3/SEC-01.txt · Day3/部署准入决定.txt · Day3/运行结果.txt
材料包/03-学员材料/课程模板与检查表-可复现版.xlsx(Day1-需求清单 · Day2-架构评审 · Day3-API报告 · Day3-部署清单)

陈述完毕。本组全部结论仅覆盖课程合成环境与课程材料版本。谢谢评审组。