Ответ 1
Если вы используете eval
, вы более уязвимы для атак: JSON - это подмножество Javascript, а json.parse просто анализирует JSON, тогда как eval
оставит дверь открытой для всех выражений JS.
My Spider Sense предупреждает меня, что использование eval()
для анализа входящего JSON - плохая идея. Мне просто интересно, является ли JSON.parse()
, который я предполагаю, является частью JavaScript, а не функцией, специфичной для браузера, - более безопасен.
Если вы используете eval
, вы более уязвимы для атак: JSON - это подмножество Javascript, а json.parse просто анализирует JSON, тогда как eval
оставит дверь открытой для всех выражений JS.
Все реализации 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.
Не все браузеры имеют встроенную поддержку JSON, поэтому будут случаи, когда вам нужно использовать eval()
для строки JSON. Используйте парсер JSON из http://json.org, поскольку для вас все намного проще.
eval()
- это зло, но против некоторых браузеров это необходимое зло, но где вы можете избежать этого, сделайте это!!!!!
Если вы разбираете JSON с помощью eval
, вы разрешаете синтаксический анализ строки содержать что угодно, поэтому вместо того, чтобы просто быть набором данных, вы могли бы выполнять вызовы функций или что-то еще.
Кроме того, JSON parse
принимает дополнительный параметр reviver, который позволяет указать, как обращаться с определенными значениями, такими как даты (больше информации и примера в встроенной документации здесь)
Существует разница между тем, что примет JSON.parse() и eval(). Попробуйте eval:
var x = "{\" shoppingCartName\ ": \" shopping_cart: 2000\ "}"
eval(x) //won't work
JSON.parse(x) //does work
См. этот пример.
JSON - это всего лишь подмножество JavaScript. Но eval
оценивает полный язык JavaScript, а не только подмножество JSON.