JSON.parse vs. eval()

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

Ответ 1

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

Ответ 2

Все реализации 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.

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

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

См. этот пример.

Ответ 6

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