回调接口验签检查
支付结果通知、消息推送与事件订阅这类回调接口本质上是外部输入边界:接收方必须校验请求来源与完整性,否则任何能访问该地址的人都能伪造一条回调,把订单状态改成已支付或把业务状态改成任意值。检查要点有四:签名校验的实现方式与密钥管理、时间戳窗口与随机数重放防护、来源地址校验(仅作辅助手段)、以及验签失败后的处理路径。最后一条最容易被忽视:验签失败必须拒绝并告警,不能静默放行。
基本信息
| 检查项 | 签名校验、时间戳窗口、重放防护、失败处理 |
|---|---|
| 校验方法 | 实现核查与联调环境测试结合 |
| 密钥管理 | 密钥与证书的存放、轮换与访问范围 |
| 正确行为 | 验签失败拒绝请求并记录审计与告警 |
典型使用场景
- 支付通知:回调决定订单最终状态,伪造即造成资损
- 退款与对账:外部系统投递的结果直接影响资金账目
- 第三方登录:授权码与票据的回传校验不严可导致账号冒用
- 消息与事件订阅:业务状态变更依赖推送,伪造可扰乱流程
- 内部系统互联:看似内网的回调地址可能被其他系统可达
核查清单
核查清单
1. 回调是否验签:签名算法、密钥来源与证书管理方式
2. 时间戳与随机数窗口:超窗口请求是否被拒绝
3. 重放防护:同一签名重复提交是否被识别并拦截
4. 来源地址或网段校验:是否作为辅助手段而非唯一手段
5. 验签失败的处理与告警:是否拒绝、是否记录、是否通知责任人检查项与对错做法
| 检查项 | 正确做法 | 错误做法 |
|---|---|---|
| 身份校验 | 强制验签并校验时间戳 | 仅依赖来源地址白名单 |
| 重放防护 | 随机数与时间窗口双校验 | 只校验签名不管重复提交 |
| 失败处理 | 拒绝请求并告警记录 | 异常分支放行,先记录后处理 |
| 密钥管理 | 独立密钥并定期轮换 | 与业务密钥共用,长期不换 |
验签逻辑存在但失败路径放行(先通过再记录)是最危险的实现:表面上有校验,实际任何伪造请求都能通过。