v1.1.0 — 回调验签 fail-closed 安全加固
概要
本版聚焦回调验签与签名链路的安全加固(由 6
语言对抗审计驱动),并统一对外文档口径。
合法整数载荷的签名结果零变化——11
条标准向量(test-vectors.json)逐字节不变,1.0.0 的正常用法无需改代码即可平滑升级。
🔒 安全加固
- 回调验签 fail-closed(重点,建议所有用户升级):
verifyCallback在计算 HMAC
之前即拒绝空 / 全空白 / 非字符串密钥(返回 false),并拒绝非字符串 /
非十六进制的sign;sign()
对空密钥直接报错。消除"密钥误配为空时验签退化为可被任意伪造"的 fail-open 隐患。 - 验签对非法输入恒返回布尔:非 ASCII / 畸形
sign、null/
非对象回调体一律判失败,不再抛异常冒泡,保证 fail-closed 契约。 - Go 具体类型容器签名:
map[string]string/[]string/struct
等以前被静默签成空串(签名豁免面),现经反射正确序列化。 - 数值守卫:签名载荷中的
NaN/Infinity/
非整数浮点一律拒绝(合约要求整数最小单位),-0归一为"0",超 2^53 大整数拒绝(防
Java(long)饱和把不同大额改写成同一错值)。 - 传输加固:非 localhost 基址强制
https;Go / TS 禁止跟随重定向;PHP 钉死
CURLOPT_SSL_VERIFYPEER/VERIFYHOST;Python 拒绝file://等非 http(s) 协议。 - PHP 新增
verifyCallbackRaw():内部以JSON_BIGINT_AS_STRING
解码,避免大整数被转 float 致验签误拒。
📝 文档
- 金额口径统一为「= 实际金额 × 10000 的整数」,移除"精度 0.0001 / 10000 = 1
元"表述与货币假设。 INTERFACES.md的channel_order_no由"恒
null"改为统一标注"(可空)",与服务端对外文档口径一致。
✅ 兼容性 / 升级
向后兼容:合法用法(整数金额、非空密钥、合法回调体)的行为与签名完全不变,11
条标准向量逐字节通过。
- 行为收紧仅作用于非法 /
异常输入:之前被静默接受或静默分叉的空密钥、浮点、非法sign、明文 http 等现在
fail-closed(返回 false
或抛清晰错误)。若此前依赖这些"碰巧能用",升级后会显式报错——这是预期的安全改进。
📦 安装
- npm:
npm i @bebebus/merchant-openapi-sdk@1.1.0 - PyPI:
pip install -U bebebus-merchant-openapi-sdk==1.1.0 - Packagist:
composer require bebebus/merchant-openapi-sdk:^1.1 - Go:
go get github.com/bebebus/SDK/go@v1.1.0
Full Changelog: v1.0.0...v1.1.0