有效输入可能意义不同
JSON文档可以是对象、数组或简单值。因此即使契约要求对象,null在语法上也有效。部分数字超过JavaScript整数精度,重复属性名在不同解析器中也可能有不同解释。
| 演示输入 | 语法解释 | 仍需检查 |
|---|---|---|
| {"ok":true} | 有效。 | 值是否符合契约? |
| {"ok":true,} | 无效:末尾逗号。 | 明确处理错误。 |
| null | 有效。 | 契约是否允许null? |
| {"id":9007199254740993} | 数字有效,但JavaScript存在精度风险。 | 该标识应按契约使用字符串。 |
| {"a":1,"a":2} | 名称重复:解释不具可移植性。 | 定义并执行拒绝策略。 |
检查每个接收阶段
- 使用受维护的JSON解析器,绝不使用eval。检查HTTP状态、预期内容类型、大小限制,明确处理缺失或格式错误的正文。
- 然后验证契约:根类型、必需字段、允许值,以及缺失、null和零的区别。契约规定时,将长标识保留为字符串。
- 设置深度与资源上限、重复名称策略和错误处理。没有适当防护,不要把收到的字符串插入HTML或查询。
记录有用错误而不暴露数据
测试部分响应、版本变化与Unicode。记录最少必要上下文,而不是秘密或完整正文。解析失败不能变成看似成功的空结果,也不能悄然停止整条处理链。
一手资料
记录 JSON API 错误,同时避免泄露有效负载。
JSON 主体可能包含标识符、密钥或个人数据。诊断通常需要事件类型、路径、结果、关联标识符以及非敏感的故障详情,而不是完整的有效负载。
- 对字段进行分类,并屏蔽诊断不需要的字段。
- 使用合成值测试解析和模式错误。
- 检查错误日志和导出操作是否复制了完整的有效负载。
一手资料:ACSC and partners — Event logging and threat detection. 相关方法:阅读实用指南.
个性化 JSON 和缓存键
附加审查点:个性化 JSON 和缓存键。表示级策略和测试旨在查找跨账户泄露和更改后内容过时的问题。
- 选择保留策略:RFC 9111 区分了不同的指令:no-cache 要求在重用前进行验证,no-store 禁止相关的 HTTP 存储,而 unqualified private 则排除共享存储。单独使用 None 并不能保证系统机密性。
- 检查键:检查方法、URI 和维度是否会影响表示的更改。Vary 属性涉及请求字段,而非授权。在应用层查找省略的语言、格式协商和账户上下文。
一手资料:IETF — RFC 9111, HTTP Caching. 相关方法:阅读实用指南.
API分页与一致导出
数据变化可能造成导出缺失或重复。
- 记录筛选条件、排序和同值时的稳定次序键。确认API提供快照还是读取动态集合。测试读取期间的新增和删除;存在游标不等于数据已冻结。
- AIP-158以空next_page_token表示结束,而非结果页较短或为空。虚构页面[A,B]和[B,C]共有四行,但只有三个唯一标识。还要检测相同游标却无进展的情况,并遵守实际API约定。
- 先持久保存批次,再确认继续状态。使用稳定标识重放中断批次,每次请求都核查权限;游标不是访问许可。快照过期时重新开始或按明确策略核对,不要悄悄拼接不同状态。
可复现的验收案例
虚构示例:数据不代表客户或实际观察结果。
查看案例输入
{
"page_1_ids": [
"A",
"B"
],
"page_2_ids": [
"B",
"C"
],
"next_cursor": "c2",
"empty_page_has_next_cursor": true
}预期判断
B重复出现。核对标识符;空页后若仍有下一游标,也应继续。
验证步骤
- 定义筛选、稳定顺序及对象身份。
- 测试重复项及含下一游标的空页。
- 保留标识及真正终止条件。 核对接收对象与唯一标识符,标记重复游标;存在后续页的空页面不应被视为采集结束。
达到预期行数就证明导出完整吗?
不能。缺失标识和重复标识可能在数量上相互抵消。比较标识、范围和截止时间,并记录未解决差异。
一手资料:Google AIP-158 — Pagination. 相关方法:阅读实用指南.
