Альтернативы JavaScript eval () для анализа JSON - PullRequest
17 голосов
/ 03 июня 2009

Быстрый вопрос. Eval в JavaScript небезопасен, не так ли? У меня есть объект JSON в виде строки, и мне нужно превратить его в реальный объект, чтобы я мог получить данные:

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

Если это поможет, я использую метод $ .ajax из jQuery.

Спасибо

Ответы [ 9 ]

25 голосов
/ 03 июня 2009

Хорошо, безопасно или нет, когда вы используете jQuery, лучше использовать метод $. GetJSON () , а не $ .ajax ():

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

eval() обычно считается безопасным для анализа JSON, когда вы обмениваетесь данными только со своим собственным сервером, особенно если вы используете хорошую библиотеку JSON на стороне сервера, которая гарантирует, что сгенерированный JSON не будет содержать ничего противного.

Даже Дуглас Крокфорд, автор JSON, сказал, что вы не должны использовать eval() где-либо в вашем коде, кроме анализа JSON. См. Соответствующий раздел в его книге JavaScript: Хорошие части

19 голосов
/ 03 июня 2009

Вы должны использовать JSON и написать JSON.parse.

«Ручной» синтаксический анализ выполняется слишком медленно, поэтому реализация JSON.parse из библиотеки проверяет содержимое, а затем в конечном итоге использует eval, поэтому все еще небезопасен . Но если вы используете более новый браузер (IE8 или Firefox), код библиотеки фактически не выполняется. Вместо этого поддержка родного браузера запускается, и тогда вы в безопасности.

Подробнее здесь и здесь .

6 голосов
/ 03 июня 2009

Если вы не можете доверять источнику, тогда вы правы ... eval небезопасен. Может использоваться для ввода кода на ваши страницы.

Проверьте эту ссылку для более безопасной альтернативы:

JSON в Javascript

На странице объясняется, почему eval небезопасен, и в нижней части страницы приводится ссылка на анализатор JSON.

5 голосов
/ 03 июня 2009

небезопасный? Это зависит от того, можете ли вы доверять данным.

Если вы можете верить, что строка будет JSON (и не будет включать, например, функции), тогда это безопасно.

Тем не менее, если вы используете jQuery, почему вы делаете это вручную? Используйте параметр dataType , чтобы указать, что это JSON, и пусть библиотека позаботится об этом за вас.

4 голосов
/ 10 августа 2010

Если вы используете jQuery, начиная с версии 1.4.1 вы можете использовать jQuery.parseJSON ()

Смотрите этот ответ: Безопасный разбор json с помощью jquery?

3 голосов
/ 03 июня 2009

Альтернативой оценке кода является его синтаксический анализ вручную. Это не так сложно, как кажется, но гораздо тяжелее во время выполнения. Вы можете прочитать об этом здесь.

Важно отметить, что оценка JSON не является небезопасной. До тех пор, пока вы доверяете источнику, чтобы не мешать. Это включает в себя проверку того, что все вещи, передаваемые в кодировщик JSON, должным образом экранированы (чтобы люди не делали двух шагов вверх по потоку, выполняя код на компьютерах ваших пользователей).

3 голосов
/ 03 июня 2009

Использование JavaScript eval небезопасно. Потому что JSON - это всего лишь подмножество JavaScript, но JavaScript eval допускает любой допустимый JavaScript.

Вместо этого используйте настоящий JSON-анализатор, такой как JSON-анализатор с json.org .

2 голосов
/ 13 июля 2011

вы можете попробовать это так

var object = new Function("return " + jsonString)()
0 голосов
/ 09 марта 2012

Еще одна отличная альтернатива - YUI: http://yuilibrary.com/yui/docs/json/

Итак, ваш код будет выглядеть примерно так:

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