Использование JavaScript eval для анализа JSON - PullRequest
7 голосов
/ 23 марта 2010

Вопрос: я использую eval для анализа возвращаемого значения JSON из одного из моих WebMethods.Я предпочитаю не добавлять jquery-json, потому что объем передачи уже достаточно велик.Поэтому я анализирую возвращаемое значение JSON с помощью eval.Теперь ходят слухи, что это небезопасно.Зачем ?
Никто не может изменить возвращаемое значение JSOn, если они не взломают мой сервер, в этом случае у меня все равно будет гораздо большая проблема.
И если они делают это локально, JavaScript выполняется только в их браузере.
Так что я не вижу, в чем проблема.Кто-нибудь может пролить свет на это, используя этот конкретный пример?

function OnWebMethodSucceeded(JSONstrWebMethodReturnValue) 
{
    var result=eval('(' + JSONstrWebMethodReturnValue + ')')
    ... // Adding result.xy to a table
}

Ответы [ 2 ]

14 голосов
/ 23 марта 2010

Основная проблема заключается в том, что eval может запускать любой JavaScript, а не только десериализовать данные в формате JSON.Это риск при использовании его для обработки JSON из ненадежного или полудоверенного источника.Частая хитрость в заключении JSON в скобки недостаточна, чтобы гарантировать, что произвольный JavaScript не выполняется.Посмотрите на это «JSON», которого на самом деле нет:

function(){alert('Hi')})(

Если бы вы имели это в переменной x и сделали это:

var result = eval("(" + x + ")");

... вы бы увиделипредупреждение - JavaScript работает.Проблема безопасности.

Если ваши данные поступают из надежного источника (и, похоже, так оно и есть), я бы не стал сильно беспокоиться об этом.Тем не менее, вас может заинтересовать обсуждение Крокфордом здесь (Крокфорд является изобретателем JSON и хорошо осведомленным специалистом по JavaScript).Крокфорд также предоставляет по крайней мере три парсера общественного достояния на этой странице , которые вы могли бы рассмотреть с помощью: Его парсера json2.js и строкового преобразователя, который при минимизации имеет размер только 2,5 Кб, но в котором все еще используется eval (этосначала нужно принять несколько мер предосторожности);его json_parse.js, который является парсером рекурсивного спуска, не использующим eval;и его json_parse_state.js, анализатор конечного автомата (опять же не использующий eval).Таким образом, вы можете выбрать свой яд. (Привет Камило Мартин за указание на эти последние две альтернативы.)

4 голосов
/ 23 марта 2010

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

Вы можете проверить поддержку нативного JSON, выполнив что-то вроде этого:

var native_JSON_exists = typeof window.JSON === 'object';

Вам следует загрузить библиотеку анализа JSON, такую ​​как библиотека Дугласа Крокфорда (связана с T.J. Crowder, выше) или функциональность, доступную через фреймворк для браузеров, которые не имеют встроенной поддержки. (Но вы должны по крайней мере использовать собственный JSON в браузерах, которые его поддерживают, чтобы защитить пользователей, которым повезло иметь современные браузеры) *

Имейте в виду, JSON является подмножеством синтаксиса JavaScript, поэтому строки, которые работают в операторе JavaScript eval, могут не работать при правильном анализе JSON. Вы можете проверить строки JSON на наличие ошибок, используя JSLint (http://www.jslint.com/).

...