读取JSON:区分语法、契约与信任

内容摘要

解析器将JSON文本转成值。它不能证明字段业务有效、发送方可靠或有权使用这些数据。

无人简报室中的全球网络地图
本文目录

有效输入可能意义不同

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重复出现。核对标识符;空页后若仍有下一游标,也应继续。

验证步骤

  1. 定义筛选、稳定顺序及对象身份。
  2. 测试重复项及含下一游标的空页。
  3. 保留标识及真正终止条件。 核对接收对象与唯一标识符,标记重复游标;存在后续页的空页面不应被视为采集结束。

Google AIP-158 — Pagination

达到预期行数就证明导出完整吗?

不能。缺失标识和重复标识可能在数量上相互抵消。比较标识、范围和截止时间,并记录未解决差异。

一手资料:Google AIP-158 — Pagination. 相关方法:阅读实用指南.