回答:
次を使用する場合、攻撃に対してより脆弱になりevalます。JSONはJavaScriptのサブセットであり、json.parseはJSONを解析するだけですが、evalすべてのJS式への扉を開いたままにします。
eval('alert(1)');。
すべてのJSON.parse実装が使用する可能性が最も高いeval()
JSON.parseDouglas 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エンジン)では、より高速です。ソース。