JSON.parse vs. eval () - PullRequest
       5

JSON.parse vs. eval ()

89 голосов
/ 04 декабря 2009

My Spider Sense предупреждает меня, что использование eval() для анализа входящего JSON - плохая идея. Мне просто интересно, если JSON.parse() - который, как я полагаю, является частью JavaScript, а не специфической для браузера функции - более безопасен.

Ответы [ 6 ]

107 голосов
/ 04 декабря 2009

Вы более уязвимы для атак , если используете eval: JSON является подмножеством Javascript, а json.parse просто анализирует JSON, тогда как eval оставит дверь открытой для всех выражений JS.

35 голосов
/ 21 апреля 2010

Все JSON.parse реализации наиболее вероятно используют eval()

JSON.parse основан на решении Дугласа Крокфорда , которое использует eval() прямо на строке 497 .

// In the third stage we use the eval function to compile the text into a
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
// in JavaScript: it can begin a block or an object literal. We wrap the text
// in parens to eliminate the ambiguity.

j = eval('(' + text + ')');

Преимущество JSON.parse состоит в том, что он проверяет, является ли аргумент правильным синтаксисом JSON.

14 голосов
/ 04 декабря 2009

Не все браузеры имеют встроенную поддержку JSON, поэтому в некоторых случаях вам нужно будет использовать eval() для строки JSON. Используйте JSON-парсер из http://json.org, так как он обрабатывает все намного проще для вас.

Eval() - это зло, но против некоторых браузеров это неизбежное зло, но там, где его можно избежать, сделайте это !!!!!

10 голосов
/ 22 февраля 2014

Существует разница между тем, что JSON.parse () и eval () примут. Попробуйте eval на этом:

var x = "{\" shoppingCartName \ ": \" shopping_cart: 2000 \ "}"

eval(x)         //won't work
JSON.parse(x)   //does work

См. пример .

9 голосов
/ 04 декабря 2009

Если вы анализируете JSON с помощью eval, вы позволяете анализируемой строке содержать абсолютно все, поэтому вместо того, чтобы быть просто набором данных, вы можете обнаружить, что выполняете вызовы функций или что-то еще.

Кроме того, parse JSON принимает дополнительный параметр, reviver, который позволяет вам указать, как обращаться с определенными значениями, такими как datetime (дополнительную информацию и пример во встроенной документации здесь )

4 голосов
/ 04 декабря 2009

JSON - это только часть JavaScript. Но eval оценивает полный язык JavaScript, а не только подмножество JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...