云购商城 · 上线前安全评审答辩
本组负责模块为订单域支付回调处理链。本材料对应课程隔离合成环境, 依据成对验证结果说明各项控制的有效性,并据此提出发布建议。
汇报小组
(成员姓名)
陈述时长
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 页 |
负责模块与发布建议
负责模块与处理链路
订单状态由支付通知驱动。本组负责链路中「校验并变更状态」环节,及其依赖的签名密钥获取与部署约束。
评审环境与版本
| 运行环境 | 课程隔离合成环境;服务仅绑定本机回环地址 127.0.0.1 |
| 服务与端口 | 回调服务 127.0.0.1:18102 | 课程服务 127.0.0.1:18080 |
| 运行版本 | Node v22.22.2 |
| 材料版本 | 学员实验手册 2026-09-06 版;课程脚本与 Day3 模板未标注版本 |
结论依据
风险识别与评审范围
评审对象:订单 1001,应付金额 88 元,币种 CNY,初始状态 PENDING。终态 PAID 表示系统已认定该订单完成收款。
风险一 · 外部伪造
未持有签名密钥者可变更订单状态
伪造一条支付成功通知提交至缺陷路径,订单被置为 PAID。
已实测:缺陷基线返回 200 accepted,订单 1001 变为 PAID。
风险二 · 通知内容失真
通知内容与订单数据不一致
金额、币种、订单号或状态流转与订单数据不符时,通知仍被受理并变更状态。
其余五项已被正确拒绝;币种一项当前未被校验。
风险三 · 重复投递
同一支付事件产生二次业务效果
渠道重试或人为重放同一事件,导致重复记账、重复发货。
已实测:重放被拒绝,订单未发生二次更新。
业务影响
评审范围边界
控制落点与责任归属
API 网关
职责范围
职责边界
回调服务 · 控制执行方
四道校验,顺序固定
全部判据均取自订单自身的合同数据,不采信通知中的自述内容。
责任分工
各环节责任角色
| 控制执行 | 回调服务 |
| 转发与入口策略 | API 网关 |
| 签名密钥管理 | 受控秘密服务 |
| 部署约束 | 平台运维 |
| 成对证据采集 | 测试 |
| 责任人 | (待确定) |
控制落点与责任归属(续)
已完成验证 · 具备原始输出
本组已完成的动作
仅完成设计 · 尚未实现
已形成设计、代码未落地
本组未对被评审代码作任何改动以影响验证结果。未实现的控制项计入未决边界,不计入恶意验收项。
证据一 · 异常通知处理
| 通知条件 | 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
材料位置:Day1/支付结果.txt 场景 6 · [B-1] [B-2]
证据说明
更新留痕:审计记录逐条对应
最近八条判定记录(倒序),每次拒绝与受理均留存:
材料位置:Day1/支付结果.txt [D] 审计事件
对照缺口:错误币种的同一事件在同一份审计中被记为 accepted,未留下拒绝记录。
证据三 · 重复事件处理
首次投递
合法通知正常受理
事件标识 E-REQ04-OK1 订单 PENDING → PAID
紧接重放同一事件(不重置订单)
同一事件标识再次投递
订单仍为 PAID 未发生二次业务更新
判重依据
判重依据为事件标识,与请求次数、时间间隔无关。同一事件标识第二次到达即予拒绝,且不变更状态。
材料位置:Day1/支付结果.txt 场景 7 · [C-1] [C-2]
两类 4xx 的性质区分
两者性质不同,记录与陈述中不得合并表述为「因签名失败而拒绝」。
相邻模块旁证
订单写入链接口另有成对实测:首次 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 元 → 422 | 88 元 → 200 | 拒绝时订单保持 PENDING | 场景 5 / [B-1] |
| 事件标识 | 缺少标识 → 400 | 携带标识 → 200 | 拒绝时订单保持 PENDING | [A-6] / [B-1] |
| 状态流转 | CREATED → 422 | PAID → 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
证据边界与状态分层
已运行 · 课程本地已验证
具备原始输出的项目
边界:仅证明课程合成环境上的行为
静态检查 · 仅有文件材料
已检查文件、未运行
边界:仅证明设计已写入,不证明运行生效
方案 · 尚未验证
仅有设计意向的项目
边界:不得记为「已通过」
与预期不一致的结论予以保留
三项易被误读的情形
缺口说明 · 币种一致性判据
异常路径 · 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,未作任何比对。
本组对该缺口的处置
未验证事项
一 · 真实渠道联调 所缺证据:真实报文与证书
验签算法、字段顺序、证书、密钥协商与重试协议均未与真实渠道对接。
二 · 目标组件与版本 所缺证据:目标组件的运行输出
网关、缓存、集群与运行身份的版本未锁定;课程模板本身未标注版本,配置类结论上限仅为静态检查。
三 · 生产环境幂等 所缺证据:并发与持久化记录
课程幂等仅在单实例内存中验证;写路径幂等键、唯一约束及并发投递表现均未测试。
四 · 无界重试的抑制 所缺证据:故障注入数据
只读推演显示部分服务持续重试,退避与熔断仍处于设计要求阶段,无上限与退避的实测记录。
五 · 真实密钥服务 所缺证据:获取与轮换日志
服务身份机制、权限配置与失败行为、轮换与吊销流程均未验证;现有记录为方案,非运行证据。
六 · 生产审计与告警 所缺证据:审计日志与告警事件
回调服务自身具备审计能力,但生产审计平台日志未取得;告警是否触发在推演中仍为未知。
另有一项流程性事项:邻组交叉复核未执行(本场未安排邻组交换),已在部署准入记录中如实登记,未以自评替代。
发布建议与补证安排
| 编号 | 补充内容 | 完成判据 | 责任角色 | 期限 |
|---|---|---|---|---|
| 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-部署清单)
陈述完毕。本组全部结论仅覆盖课程合成环境与课程材料版本。谢谢评审组。