
JSONのようなコンテンツが与えられた場合、JSON Sanitizerはそれを有効なJSONに変換します。
これはデータパイプラインの両端に配置することで、Postelの原則を満たすのに役立ちます:
自分が行うことは保守的に、他人から受け入れることは寛容に
他者からのJSONのようなコンテンツに適用すると、使用する任意のパーサーを満たす、整形式のJSONを生成します。
送信前の自分の出力に適用すると、エンコーディングの軽微な誤りを修正し、JSONをHTMLやXMLに埋め込みやすくします。

多くのアプリケーションは、アドホックな方法でJSON出力を生成する大量のコードを持っています。
多くの場合、これらの出力はすべて、ネットワークを介して送信される前に、少量のフレームワークコードを通過します。この少量のフレームワークコードは、このライブラリを使用して、アドホックな出力が標準に準拠し、JavaScriptのeval演算子のような(過度に)強力なデシリアライザに渡しても安全であることを確認できます。
アプリケーションはまた、さまざまなソースからJSONを受信するWebサービスAPIを持つことがよくあります。このJSONがアドホックな方法で作成された場合、このライブラリは解析しやすい形に整形できます。
このライブラリをリクエストとレスポンスを送受信するコードに組み込むことで、ソフトウェアアーキテクトがシステム全体のセキュリティと整形式性の保証を確保するのに役立ちます。
サニタイザーはJSONのようなコンテンツを受け取り、JSのevalと同様に解釈します。具体的には、以下の非標準的な構文を処理します。
| 構文 | 方針 |
|---|---|
'...' | シングルクォートで囲まれた文字列はJSON文字列に変換されます。 |
\xAB | 16進エスケープはJSONユニコードエスケープに変換されます。 |
\012 | 8進エスケープはJSONユニコードエスケープに変換されます。 |
0xAB | 16進整数リテラルはJSON10進数に変換されます。 |
012 | 8進整数リテラルはJSON10進数に変換されます。 |
+.5 | 10進数はJSONのより厳格な形式に強制されます。 |
[0,,2] | 配列の省略はnullで埋められます。 |
[1,2,3,] | 末尾のカンマは削除されます。 |
{foo:"bar"} | 引用符なしのプロパティ名は引用符で囲まれます。 |
//comments | JS形式の行コメントとブロックコメントは削除されます。 |
(...) | グループ化の括弧は削除されます。 |
サニタイザーは、欠落した句読点、終わりの引用符、不一致または欠落した閉じ括弧を修正します。入力に空白のみが含まれている場合は、有効なJSON文字列nullが代わりに使用されます。
出力は、RFC 4627で定義された整形式のJSONです。出力は以下の追加のプロパティを満たします:
"</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のサニタイズでは、混乱した代理攻撃からアプリケーションを保護することはできません
var myValue = JSON.parse(sanitizedJsonString);
addToAdminstratorsGroup(myValue.propertyFromUntrustedSource);
sanitizeメソッドは、入力がすでに上記のプロパティを満たす有効なJSONである場合、新しいバッファを割り当てずに入力文字列を返します。したがって、通常は整形式の入力に使用すると、メモリオーバーヘッドは最小限です。
sanitizeメソッドの時間計算量はO(n)で、nはUTF-16コードユニットでの入力の長さです。