Основная проблема заключается в том, что 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
).Таким образом, вы можете выбрать свой яд. (Привет Камило Мартин за указание на эти последние две альтернативы.)