19

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

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

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

ありがとう

4

9 に答える 9

27

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

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

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

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

于 2009-06-03T14:28:49.437 に答える
19

JSONを使用し、JSON.parse を記述する必要があります。

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

詳細はこちらこちらをご覧ください。

于 2009-06-03T14:44:47.783 に答える
6

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

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

JavaScript での JSON

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

于 2009-06-03T14:23:54.627 に答える
5

安全でない?それは、データを信頼できるかどうかによって異なります。

文字列が JSON になる (関数などを含まない) ことが信頼できる場合は、安全です。

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

于 2009-06-03T14:19:50.063 に答える
4

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

この回答を参照してください: jquery を使用した安全な json 解析?

于 2010-08-10T16:40:17.710 に答える
3

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

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

于 2009-06-03T14:21:29.640 に答える
3

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

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

于 2009-06-03T14:21:42.883 に答える
2

このように試すことができます

var object = new Function("return " + jsonString)()
于 2011-07-13T10:35:34.627 に答える
0

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

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

Y.JSON.parse('{"id": 15, "name": "something"}');
于 2012-03-09T17:05:00.683 に答える