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は共有ストレージを除外します。no-のみではシステムの機密性は保証されません。
  • キーの検査: 表現を変更するメソッド、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. 関連する方法:実践ガイドを読む.