Разница между 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?
Ответы
Ответ 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, вероятно, будет быстрее.