web-dev-qa-db-ja.com

JSON.parse vs. eval()

私のSpider Senseは、eval()を使用して着信JSONを解析することは悪い考えだと警告しています。 JSON.parse()-これはJavaScriptの一部であり、ブラウザ固有の機能ではないと思う-の方が安全かどうか疑問に思っています。

89
Kevin Major

攻撃に対してより脆弱ですevalを使用する場合:JSONはJavascriptのサブセットであり、json.parseはJSONを解析しますが、evalはすべてのJSにドアを開けたままにします式。

107
jldupont

すべての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構文であることを検証することです。

36
plodder

すべてのブラウザがネイティブJSONをサポートしているわけではないため、JSON文字列に対してeval()を使用する必要がある場合があります。 http://json.org のJSONパーサーを使用すると、すべてがより簡単に処理されます。

Eval()は悪ですが、一部のブラウザにとっては必要な悪ですが、回避できる場合はそうしてください!!!!!

14
AutomatedTester

JSON.parse()とeval()が受け入れるものには違いがあります。これでevalを試してください:

var x = "{\" shoppingCartName\":\" shopping_cart:2000\"}"

eval(x)         //won't work
JSON.parse(x)   //does work

これを参照してください

10
Jeff Lowery

JSONをevalで解析すると、解析対象の文字列に絶対に何でも含めることができるため、単なるデータのセットではなく、関数呼び出しなどを実行できます。

また、JSONのparseは、datetimeなどの特定の値の処理方法を指定できる追加パラメーターreviverを受け入れます(詳細とインラインドキュメントの例 here

9
David Hedlund

JSONはJavaScriptのサブセットです。ただし、evalは、JSONのサブセットだけでなく、完全なJavaScript言語を評価します。

4
Gumbo