私のSpider Senseは、eval()
を使用して着信JSONを解析することは悪い考えだと警告しています。 JSON.parse()
-これはJavaScriptの一部であり、ブラウザ固有の機能ではないと思う-の方が安全かどうか疑問に思っています。
攻撃に対してより脆弱ですeval
を使用する場合:JSONはJavascriptのサブセットであり、json.parseはJSONを解析しますが、eval
はすべてのJSにドアを開けたままにします式。
すべてのJSON.parse
実装は、ほとんどの場合eval()
を使用します
JSON.parse
は、 Douglas Crockfordのソリューション に基づいています。これは、すぐにeval()
を使用します 行497 。
// 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をサポートしているわけではないため、JSON文字列に対してeval()
を使用する必要がある場合があります。 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
は、datetimeなどの特定の値の処理方法を指定できる追加パラメーターreviverを受け入れます(詳細とインラインドキュメントの例 here )
JSONはJavaScriptのサブセットです。ただし、eval
は、JSONのサブセットだけでなく、完全なJavaScript言語を評価します。