web-dev-qa-db-ja.com

JSONを解析するためのJavaScripteval()の代替

簡単な質問。 JavaScriptでの評価は安全ではありませんか?文字列としてJSONオブジェクトがあり、データを取得できるように、それを実際のオブジェクトに変換する必要があります。

function PopulateSeriesFields(result) 
{
    data = eval('(' + result + ')');
    var myFakeExample = data.exampleType
}

それが役立つ場合は、jQueryの$ .ajaxメソッドを使用しています。

ありがとう

18
Damien

安全かどうかは別として、jQueryを使用している場合は、$。ajax()ではなく $。getJSON() メソッドを使用することをお勧めします。

_$.getJSON(url, function(data){
    alert(data.exampleType);
});
_

eval()は通常、自分のサーバーとのみ通信している場合、特に生成されたJSONに厄介なものが含まれないことを保証するサーバー側で優れたJSONライブラリを使用している場合、JSON解析に対して安全であると見なされます。

JSONの作成者であるDouglasCrockfordでさえ、JSONの解析を除いて、コード内のどこでもeval()を使用すべきではないと述べました。彼の本の対応するセクションを参照してください JavaScript:The Good Parts

26
Rene Saarsoo

[〜#〜] json [〜#〜] を使用して、JSON.parseを作成する必要があります。

「手動」解析は遅すぎるため、ライブラリからのJSON.parse実装は内容をチェックし、evalを使用することになります。したがって、 まだ安全ではありません です。ただし、新しいブラウザ(IE8またはFirefox)を使用している場合、ライブラリコードは実際には実行されません。代わりに、ネイティブブラウザサポートが開始され、安全になります。

続きを読む ここ および ここ

19
buti-oxa

ソースを信頼できない場合は、正しいです... evalは安全ではありません。これは、ページにコードを挿入するために使用できます。

より安全な代替手段については、このリンクを確認してください。

JavascriptのJSON

このページでは、evalが安全でない理由を説明し、ページの下部にJSONパーサーへのリンクを提供します。

6
Justin Niessner

安全ではありませんか?それはあなたがデータを信頼できるかどうかに依存します。

文字列がJSONである(そして、たとえば関数を含まない)と信頼できる場合は、安全です。

そうは言っても、jQueryを使用しているのなら、なぜこれを手動で行っているのですか? dataType オプションを使用して、それがJSONであることを指定し、ライブラリに自動的に処理させます。

5
Quentin

JQueryを使用している場合、バージョン1.4.1以降、jQuery.parseJSON()を使用できます。

この答えを参照してください: jqueryで安全なjson解析?

4
thomh

JavaScriptのevalを使用することは安全ではありません。 JSONはJavaScriptのサブセットにすぎませんが、JavaScriptのevalは任意の有効なJavaScriptを許可するためです。

代わりに、 json.orgのJSONパーサー のような実際のJSONパーサーを使用してください。

3
Gumbo

コードを評価する代わりに、手動でコードを解析することもできます。思ったほど難しくはありませんが、実行時にはかなり重くなります。 ここでそれについて読むことができます。

注意すべき重要な部分は、JSONの評価は本質的に安全ではないということです。ソースが物事を台無しにしないことを信頼している限り。これには、JSONエンコーダーに渡されたものが適切にエスケープされていることを確認することも含まれます(ユーザーのマシンでコードを実行するストリームの2ステップ上の人々を停止するため)。

3
Oli

あなたはこのようにそれを試すことができます

var object = new Function("return " + jsonString)()
2
TheBrain

もう1つの優れた代替手段はYUIです: http://yuilibrary.com/yui/docs/json/

したがって、コードは次のようになります。

Y.JSON.parse('{"id": 15, "name": "something"}');
0
Zlatko