2009-06-03 38 views
16

クイック質問。 JavaScriptの評価は安全ではありませんか?私は、文字列としてJSONオブジェクトを持っていると私は、データを取得することができますので、実際のオブジェクトにそれを有効にする必要があります。JSONを解析するためのJavaScript eval()の代替

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

それは私がjQueryのから$アヤックスの方法を使用していますができます場合。

ありがとうございました

+0

私はここに同様の質問を:http://stackoverflow.com/questions/646597/eval-is-evil-so-what-should-i-use-instead – karlipoppins

答えて

25

安全かどうかまあ、あなたはjQueryのを使用しているとき、あなたは$.getJSON()メソッドを使用することをお勧めしている、いない$アヤックス():あなた

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

eval()は通常、JSONの解析のために安全であると考えていますあなた自身のサーバーと通信しているだけで、特に生成されたJSONが何か厄介なものを含んでいないことを保証する良いJSONライブラリをサーバー側で使用している場合は特にそうです。

JSONの作成者でもあるDouglas Crockford氏は、JSONの解析以外は、コード内のどこにでもeval()を使用しないでください。彼の本の対応するセクションを参照してくださいJavaScript: The Good Parts

+1

私はまったく同じこと+1 –

+0

を書いていましたが、今私はこれを参照しています。 – Damien

+17

"getJSON"はデータ型が 'json'の$ .ajaxとまったく同じです... – James

5

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

文字列がJSON(関数などは含まれません)と信頼できる場合は安全です。

これは、jQueryを使用している場合、なぜ手動でこれを行うのですか? dataTypeオプションを使用して、それがJSONであることを指定し、ライブラリがあなたのために世話をするようにします。

+1

jQueryのはevalを使用しています... – James

+2

@JP:ただし、JSONが利用できない場合に限ります。 http://dev.jquery.com/browser/trunk/jquery/src/ajax.js#L504 – Gumbo

+0

私はdataTypeを持っていますが、それでも文字列として戻ってきます。私はアプリケーションを試してみます/ JSON – Damien

3

JavaScriptを使用すると、evalは危険です。 JSONはJavaScriptのサブセットにすぎませんが、JavaScriptのevalは有効なJavaScriptを許可します。

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

3

コードを評価する代わりに、手動で解析することもできます。それは聞こえるほど困難ではありませんが、実行時にかなり重くなります。 You can read about it here.

重要な点は、JSONの評価が本質的に安全ではないことです。限り、あなたは物事をボールにしないソースを信頼する限り。これは、JSONエンコーダーに渡されたものが適切にエスケープされていることを確認すること(ユーザーのマシン上でコードを実行するストリームをユーザーが2ステップ上げるのを止めるため)です。

6

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

は、より安全な代替のために、このリンクをチェックアウト:evalは安全でないと、ページの下部にJSONパーサーへのリンクを提供し、なぜ

JSON in Javascript

をページは説明しています。

19

あなたはJSONを使用し、JSON.parseを書くべきです。

"Manual"構文解析が遅すぎるため、ライブラリのJSON.parse実装が問題をチェックしてからevalを使用して終了しますので、still unsafeです。しかし、新しいブラウザ(IE8またはFirefox)を使用している場合、ライブラリコードは実際には実行されません。代わりに、ネイティブブラウザのサポートが起動し、あなたは安全です。

続きを読むherehere

+0

http://code.google.com/p/json-sans-eval/は、高速で安全な手動パーサーです。利用可能な場合はネイティブサポートが優先されるべきですが、あなたは正しいです。 –

4

あなたは、バージョン1.4.1のように、jQueryのを使用している場合は、

がこの回答を参照してくださいjQuery.parseJSON()を使用することができます:Safe json parsing with jquery?

2

あなたはこの

var object = new Function("return " + jsonString)() 
+1

これは単にevalエイリアスです。 –

+2

(面白いのは、最初のスキャンで「悪いエイリアス」と読む:-) –

+0

意味的には違いはありません。 –

0

ようにそれを試すことができますがもう一つの素晴らしい選択肢はYUIです: http://yuilibrary.com/yui/docs/json/

あなたのコードは次のようになります:

Y.JSON.parse('{"id": 15, "name": "something"}'); 
関連する問題