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