формат JSON.анализа и оценки()


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

6 86

6 ответов:

вы более уязвимы для атак при использовании eval: JSON-это подмножество Javascript и json.разобрать просто парсит 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 принимает aditional параметр reviver, который позволяет указать, как работать с определенными значениями, такими как datetimes (дополнительная информация и пример В встроенной документации здесь)

есть разница между тем, что 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.