应用于JSON字符串时angular.fromJson和$ scope.$ eval之间的差异

Man*_*ube 22 javascript json angularjs

在我的angularjs应用程序中,我通常使用解析JSON字符串angular.fromJson,如下所示:

var myObject=angular.fromJSON(jsonString);
Run Code Online (Sandbox Code Playgroud)

但是,似乎我会通过使用获得相同的结果$scope.$eval:

var myObject=$scope.$eval(jsonString);
Run Code Online (Sandbox Code Playgroud)

看到这个小提琴

或者通过使用vanilla javaScript,如下所示:

var myObject=JSON.parse(jsonString);
Run Code Online (Sandbox Code Playgroud)
  • 是否有任何特别的理由使用angular.fromJSON而不是JSON.parse

  • 使用$scope.$eval解析JSON字符串时是否存在任何问题?

bva*_*ghn 32

查看源代码:

function fromJson(json) {
  return isString(json)
      ? JSON.parse(json)
      : json;
}
Run Code Online (Sandbox Code Playgroud)

他们刚刚经过JSON.parse.

至于$ eval,它会弹出$ parse:

  // $scope.$eval source:
  $eval: function(expr, locals) {
    return $parse(expr)(this, locals);
  },
Run Code Online (Sandbox Code Playgroud)

$ parse source太长而无法发布,但它基本上能够将内联(字符串化)对象转换为真实对象,所以在这种情况下,它实际上也会转换你的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 :(
Run Code Online (Sandbox Code Playgroud)

使用$ scope.$ eval解析JSON字符串时是否存在任何问题?

我不这么认为,除了你做的工作多于必要的工作.因此,如果您知道自己拥有JSON,则没有理由使用较重的$ parse函数.


00d*_*ani 5

上面的答案几乎是正确的。但是,使用一个潜在的问题$scope.$eval()解析JSON字符串,不与任何存在JSON.parse()angular.fromJson():安全。Angular 允许表达式包含复杂的 JavaScript,包括函数调用、条件 with ?:、变量赋值等。如果您使用$scope.$eval(),所有这些都会被识别和处理,即使它们是由恶意最终用户添加的。

JSON 不支持任何那些更复杂的 JavaScript 功能,也不支持任何其他潜在的“危险”功能。如果您使用真正的 JSON 解析器,例如JSON.parse()angular.fromJson(),则不可能注入和执行恶意代码。

由于角表达式分离,只能在当前评估$scope,代码注入的风险有所减轻-$scope.$eval()远小于危险比JavaScript的本地eval()解析JSON。然而,仍然没有理由为此目的使用任何一个函数,因为存在潜在的安全风险,并且使用适当的 JSON 解析器可能会更快。