回答:
次を使用する場合、攻撃に対してより脆弱になりeval
ます。JSONはJavaScriptのサブセットであり、json.parseはJSONを解析するだけですが、eval
すべてのJS式への扉を開いたままにします。
eval('alert(1)');
。
すべてのJSON.parse
実装が使用する可能性が最も高いeval()
JSON.parse
Douglas Crockfordのソリューションに基づいており、497行目で使用さeval()
れています。
// In the third stage we use the eval function to compile the text into a
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
// in JavaScript: it can begin a block or an object literal. We wrap the text
// in parens to eliminate the ambiguity.
j = eval('(' + text + ')');
の利点JSON.parse
は、引数が正しいJSON構文であることを検証することです。
JSON.parse()
Linux MintシステムのFirefox 28とChromium 33でテストしました。eval()
Firefoxの2倍、Chromiumの4倍の速さでした。あなたが投稿しているソースコードはわかりませんが、私のブラウザーでは同じではありません。
すべてのブラウザーがネイティブJSONサポートを備えているわけではないeval()
ため、JSON文字列を使用する必要がある場合があります。http://json.orgの JSONパーサーを使用してください。これにより、すべての処理がはるかに簡単になります。
Eval()
悪ですが、一部のブラウザでは必要な悪ですが、回避できる場合はそうしてください!!!!!!
JSON.parse()とeval()が受け入れるものには違いがあります。これについてevalを試してください:
var x = "{\" shoppingCartName \ ":\" shopping_cart:2000 \ "}"
eval(x) //won't work
JSON.parse(x) //does work
この例を参照してください。
JSONを解析すると eval
、解析される文字列に絶対に何でも含めることができるため、単なるデータセットではなく、関数呼び出しなどを実行することができます。
また、JSON parse
は追加のパラメーターreviverを受け入れます。これにより、日時などの特定の値の処理方法を指定できます(詳細とインラインドキュメントの例はこちら)。
JSONはJavaScriptのサブセットにすぎません。ただしeval
、JSONのサブセットだけでなく、完全なJavaScript言語を評価します。
JSON.parse
(JavaScriptエンジンに直接実装)はJSONのみを解析します。しかし、他の非ネイティブ実装は、いくつかの健全性チェックeval
を行ってから、パフォーマンス上の理由で使用します。
JSON.parse
はeval
、少なくともV8(ChromiumのJSエンジン)では、より高速です。ソース。