第3章:输入字符串格式要求——长度、字符集、字段分隔符
3.1 适用场景
本章适用于所有需要将原始支付敏感字符串接入 R8 规则引擎进行解析的场景。凡涉及卡号、有效期、CVN、令牌、加密密文等敏感字段的拼接与传输,均须按照本章定义的格式规范进行前置校验。典型场景包括:
- 支付网关交易报文预处理——收银台将明文或密文敏感字段拼接为统一字符串传入规则引擎
- 生命周期管理——令牌申请、更新、撤销时传递的复合型敏感字符串
- 跨系统敏感数据交换——不同安全域之间通过中间件传输支付敏感负载
- 日志脱敏前置管道——对原始字符串做格式检查后再执行 R8 规则的脱敏或阻截动作
3.2 前置条件
| 序号 |
条件项 |
验收标准 |
责任角色 |
| 1 |
R8 规则引擎已部署并处于可接收状态 |
引擎健康检查端点返回 200 |
系统运维 |
| 2 |
敏感字符串来源已确认安全通道(TLS 1.2+ / VPN) |
链路握手日志无告警 |
网络工程师 |
| 3 |
调用方已获取本章格式规范文档 v3.2 或更高版本 |
版本号与规则库一致 |
应用开发 |
| 4 |
上游数据已完成脱敏分级标记(明文/掩码/加密) |
字段元数据标签齐全 |
数据治理 |
3.3 操作步骤
| 步骤 |
操作 |
关键检查点 |
输出 |
| 步骤1 |
定义最大/最小字符串长度 |
长度边界与业务字段实际最大长度对齐 |
LengthPolicy.json |
| 步骤2 |
申明允许字符集(US-ASCII 子集或 Base64 安全字母表) |
禁止控制字符、不可见字符、Unicode 风险字符 |
CharsetWhitelist.txt |
| 步骤3 |
指定字段分隔符及转义规则 |
分隔符不得出现在敏感字段值内部(或使用 RFC 式转义) |
DelimiterSpec.md |
| 步骤4 |
集成前置格式校验网关 |
校验失败时返回 400 FORMAT_VIOLATION 而非规则引擎降级 |
校验网关部署记录 |
| 步骤5 |
执行冒烟测试(含边界值、非法字符、分隔符冲突) |
全量用例通过率 100% |
测试报告 v3.2-001 |
3.4 输入输出物
| 类别 |
名称 |
格式 |
说明 |
| 输入 |
原始支付敏感字符串 |
String(UTF-8 编码,仅含允许字符集) |
调用方传入的待解析负载 |
| 输出 |
格式校验结果对象 |
JSON |
包含 valid(boolean)、errors(数组)、parsedFields(对象) |
| 输出 |
格式规范文档 |
Markdown |
供调用方集成参考的契约文件 |
| 输出 |
校验网关日志(含每次调用的格式快照) |
结构化日志(JSON Lines) |
用于审计与异常追溯 |
3.5 责任边界
| 角色 |
职责 |
不负责 |
| 调用方(上游系统) |
确保发出的字符串在长度、字符集、分隔符上完全合规 |
不负责解析规则引擎内部的敏感字段语义 |
| R8 规则引擎 |
执行格式前置校验,对不合规字符串拒绝并明确报错 |
不负责修正上游格式错误或自动补全字段 |
| 安全审计组 |
定期抽查校验日志,确认无格式绕过异常 |
不参与日常格式策略变更的审批流 |
| 格式策略管理员 |
维护长度、字符集、分隔符策略文件并做版本管理 |
不直接修改上游调用代码 |
3.6 记录材料
- 格式策略文件:
LengthPolicy.json、CharsetWhitelist.txt、DelimiterSpec.md,纳入 Git 版本库 /policies/r8-format-v3 路径下。
- 校验网关日志:每日轮转,保留 180 天,字段包括
timestamp、callerId、inputLength、validationResult、errorCode。
- 格式变更审批单:所有策略修改须通过 ITSM 流程,关联工单号记录在策略文件 commit message 中。
3.7 异常处理
| 异常类型 |
触发条件 |
处理动作 |
返回码 |
| 长度超限 |
字符串长度 < 8 或 > 2048 字符 |
拒绝解析,记录 LENGTH_OUT_OF_BOUNDS 错误 |
400 |
| 非法字符命中 |
包含不在 CharsetWhitelist.txt 中的字符 |
拒绝解析,标明首个非法字符位置 |
400 |
| 分隔符冲突 |
字段内部出现未转义的分隔符,或转义序列格式错误 |
拒绝解析,提示 DELIMITER_COLLISION 及上下文片段 |
400 |
| 空字符串/空字段 |
输入为空或某字段值为空 |
拒绝解析,返回 EMPTY_FIELD 错误详情 |
400 |
| 连续分隔符 |
两个分隔符之间无任何字符 |
拒绝解析,标记为 MALFORMED_DELIMITER |
400 |
关键原则:格式校验必须在进入 R8 规则引擎核心逻辑之前完成。任何格式异常均不得透传到下游脱敏或路由模块,避免因字符串畸变导致规则误匹配或敏感数据泄露。
3.8 验收标准
| 验收项 |
预期结果 |
验证方式 |
| 合法字符串通过校验 |
返回 valid: true,errors 数组为空,parsedFields 正确拆解 |
至少 10 组合规用例冒烟测试 |
| 超长/超短字符串被拒绝 |
返回 valid: false,错误码 LENGTH_OUT_OF_BOUNDS |
边界值:长度 7、8、2048、2049 各测试 3 次 |
| 非法字符被拒绝 |
返回 valid: false,错误码 ILLEGAL_CHARACTER |
分别测试控制字符、空格(不在白名单时)、emoji、中文全角符号 |
| 分隔符冲突被拒绝 |
返回 valid: false,错误码 DELIMITER_COLLISION |
在字段值中直接插入未转义的分隔符场景 |
| 校验日志完整可追溯 |
每个请求均产生一条 JSON Lines 日志,包含 callerId、inputLength、result |
日志抽取工具验证 24 小时日志完整率 ≥ 99.9% |
3.9 输入字符串格式结构参考
下图展示了 R8 规则引擎期望的支付敏感字符串整体结构,包括长度边界、字符集允许范围、字段分隔符布局以及转义机制。该结构是本章所有校验规则的直接映射。
格式设计原则提醒:分隔符采用竖线 |(ASCII 0x7C),其视觉辨识度高且极少出现在标准支付字段值中。若业务确需在字段内包含竖线,必须使用双反斜杠 \\| 转义,转义序列本身不计入字段值长度,但计入字符串总长度。字符集白名单中显式排除了 NULL (0x00)、DEL (0x7F) 以及所有 CR/LF 类控制字符,防止注入式解析歧义。