
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"が含まれないため、追加のエンコードなしでHTMLのscript要素内に埋め込むことができます。"]]>"が含まれないため、追加のエンコードなしで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);
sanitizeメソッドは、入力がすでに上記のプロパティを満たす有効なJSONである場合、新しいバッファを割り当てずに入力文字列を返します。したがって、通常は適切に形成された入力に使用すると、メモリオーバーヘッドは最小限です。
sanitizeメソッドはO(n)時間で動作します。ここでnはUTF-16コード単位での入力の長さです。
| 構造 | ポリシー |
|---|
'...' | シングルクォートで囲まれた文字列はJSON文字列に変換されます。 |
\xAB | 16進エスケープはJSONのUnicodeエスケープに変換されます。 |
\012 | 8進エスケープはJSONのUnicodeエスケープに変換されます。 |
0xAB | 16進整数リテラルはJSONの10進数値に変換されます。 |
012 | 8進整数リテラルはJSONの10進数値に変換されます。 |
+.5 | 10進数値はJSONのより厳密な形式に強制されます。 |
[0,,2] | 配列の省略要素はnullで埋められます。 |
[1,2,3,] | 末尾のカンマは削除されます。 |
{foo:"bar"} | 引用符なしのプロパティ名は引用符で囲まれます。 |
//comments | JS形式のラインコメントとブロックコメントは削除されます。 |
(...) | グループ化の括弧は削除されます。 |