
JSON に似たコンテンツを、JSON Sanitizer は有効な JSON に変換します。
これは、データパイプラインの両端に接続して、Postel の原則を満たすのに役立ちます。
自分が行うことには保守的に、他人から受け入れることには寛容に
他人から受け取った JSON に似たコンテンツに適用すると、使用するあらゆるパーサーを満足させる、適切に形成された JSON が生成されます。
送信前に出力に適用すると、エンコーディングの小さな誤りを修正し、JSON を HTML や XML に埋め込みやすくなります。

多くのアプリケーションには、JSON 出力を生成するためにアドホックな方法を使う大量のコードがあります。
多くの場合、これらの出力はすべて、ネットワーク経由で送信される前に、少量のフレームワークコードを通過します。この少量のフレームワークコードは、このライブラリを使用して、アドホックな出力が標準に準拠し、Javascript の eval 演算子のような(過度に)強力なデシリアライザに渡しても安全であることを確認できます。
アプリケーションはまた、さまざまなソースから JSON を受け取る Web サービス API を備えていることがよくあります。この JSON がアドホックな方法で作成された場合、このライブラリはそれを解析しやすい形式に整形できます。
このライブラリをリクエストとレスポンスを送受信するコードに組み込むことで、このライブラリはソフトウェアアーキテクトがシステム全体のセキュリティと整形式性の保証を確保するのに役立ちます。
サニタイザは、JSON に似たコンテンツを受け取り、JS の eval が行うように解釈します。具体的には、次の非標準構文を扱います。
サニタイザは、欠落している句読点、終わりの引用符、および不一致または欠落している閉じ括弧を修正します。入力が空白のみの場合、有効な JSON 文字列 null に置き換えられます。
出力は、RFC 4627 で定義されている整形式の JSON です。 出力は次の追加プロパティを満たします:
"<script"、"</script"、"<!--" が含まれないため、追加のエンコーディングなしで HTML のスクリプト要素内に埋め込むことができます。"]]>" が含まれないため、追加のエンコーディングなしで XML CDATA セクション内に埋め込むことができます。eval 組み込み関数または JSON.parse で解析できます。具体的には、出力には JS の改行(U+2028 段落区切り文字または U+2029 行区切り文字)が埋め込まれた文字列リテラルは含まれません。出力は整形式の JSON であるため、eval に渡しても副作用や自由変数がなく、コードインジェクションのベクターでも、秘密情報の外部漏えいのベクターでもありません。
このライブラリが保証するのは、JSON 文字列 → Javascript オブジェクトのフェーズに副作用がなく、自由変数を解決しないことだけであり、その結果得られた Javascript オブジェクトを後で他のクライアントサイドコードがどのように解釈するかを制御することはできません。したがって、クライアントサイドコードが、攻撃者によって制御された解析データの一部を受け取り、それを eval や innerHTML のような強力なインタプリタに戻して渡すと、そのクライアントサイドコードが意図しない副作用に悩まされる可能性があります。
var myValue = eval(sanitizedJsonString); // safe
var myEmbeddedValue = eval(myValue.foo); // possibly unsafe
さらに、JSON のサニタイズは、Confused Deputy 攻撃 からアプリケーションを保護することはできません。
var myValue = JSON.parse(sanitizedJsonString);
addToAdminstratorsGroup(myValue.propertyFromUntrustedSource);
サニタイズメソッドは、入力が上記のプロパティを満たす有効な JSON である場合、新しいバッファを割り当てずに入力文字列を返します。したがって、通常は整形式である入力に使用した場合、メモリのオーバーヘッドは最小限です。
サニタイズメソッドの時間計算量は O(n) です。ここで、n は UTF-16 コード単位での入力の長さです。
| 構文 | 方針 |
|---|
'...' | 単一引用符で囲まれた文字列は JSON 文字列に変換されます。 |
\xAB | 16 進エスケープは JSON ユニコードエスケープに変換されます。 |
\012 | 8 進エスケープは JSON ユニコードエスケープに変換されます。 |
0xAB | 16 進整数リテラルは JSON 10 進数に変換されます。 |
012 | 8 進整数リテラルは JSON 10 進数に変換されます。 |
+.5 | 10 進数は JSON のより厳密な形式に強制されます。 |
[0,,2] | 配列の省略(穴)は null で埋められます。 |
[1,2,3,] | 末尾のカンマは削除されます。 |
{foo:"bar"} | 引用符で囲まれていないプロパティ名は引用符で囲まれます。 |
//comments | JS スタイルの行コメントとブロックコメントは削除されます。 |
(...) | グループ化の括弧は削除されます。 |