Подтвердить что ты не робот

Разница между angular.fromJson и $scope. $Eval при применении к строке JSON

В моих приложениях angularjs я обычно разбираю строку JSON с помощью angular.fromJson, например:

var myObject=angular.fromJSON(jsonString);

Однако, похоже, я получил бы тот же результат, используя $scope.$eval:

var myObject=$scope.$eval(jsonString);

Посмотрите эту скрипку

Или используя vanilla javaScript, например:

var myObject=JSON.parse(jsonString);
  • Есть ли какая-то конкретная причина использовать angular.fromJson, а не JSON.parse?

  • Есть ли какая-нибудь возможная проблема при использовании $scope.$eval для синтаксического анализа строки JSON?

4b9b3361

Ответ 1

Проверьте исходный код:

function fromJson(json) {
  return isString(json)
      ? JSON.parse(json)
      : json;
}

Они просто проходят до JSON.parse.

Что касается $eval, он выдает $parse:

  // $scope.$eval source:
  $eval: function(expr, locals) {
    return $parse(expr)(this, locals);
  },

$Источник синтаксиса слишком длинный для публикации, но он по существу способен преобразовывать встроенные (стробированные) объекты в реальные объекты, и поэтому имеет смысл, что в этом случае он фактически преобразует ваш JSON.

(я не знал этого до тех пор, пока не прочитал источник $parse.)

Есть ли какая-то конкретная причина использовать angular.fromJSON, а не JSON.parse?

Нет, не совсем. Хотя они действительно проверяют, чтобы вы не дважды разбирали строку JSON, например:

var jsonString = '{"foo":"bar"}';
var json = JSON.parse(jsonString); // Parsing once is good :)
JSON.parse(json); // Parsing twice is bad :(

Есть ли какая-либо возможная проблема при использовании $scope. $eval для синтаксического анализа строки JSON?

Я так не думаю, что ты делаешь больше работы, чем нужно. Итак, если вы знаете, что у вас JSON, нет причин использовать более тяжелую функцию $parse.

Ответ 2

Вышеуказанный ответ почти правильный. Однако существует потенциальная проблема с использованием $scope.$eval() для синтаксического анализа строки JSON, которая не существует ни с помощью JSON.parse(), либо angular.fromJson(): security. Angular позволяет выражению содержать сложный JavaScript, включая вызовы функций, условные выражения с ?:, назначения переменных и т.д. Все они распознаются и обрабатываются, если вы используете $scope.$eval(), даже если они были добавлены вредоносным конечным пользователем.

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

Так как выражения Angular изолированы и оцениваются только в текущем $scope, риск инъекции кода несколько смягчается - $scope.$eval() гораздо менее опасен, чем JavaScript native eval() для разбора JSON. Однако по-прежнему нет причин использовать любую функцию для этой цели, поскольку существует потенциальный риск для безопасности, и использование надлежащего анализатора JSON, вероятно, будет быстрее.