Json和$scope的角度之间的差异$eval应用于JSON字符串时
Difference between angular.fromJson and $scope.$eval when applied to JSON string
在我的angularjs应用程序中,我通常使用angular.fromJson
解析JSON字符串,如下所示:
var myObject=angular.fromJSON(jsonString);
然而,我似乎可以通过使用$scope.$eval
:获得相同的结果
var myObject=$scope.$eval(jsonString);
看看这个小提琴
或者使用vanillajavaScript,比如:
var myObject=JSON.parse(jsonString);
使用
angular.fromJSON
而不是JSON.parse
有什么特殊的原因吗?使用
$scope.$eval
解析JSON字符串时是否存在任何可能的问题?
查看源代码:
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);
},
$parse源太长,无法发布,但它基本上能够将内联(字符串化)对象转换为真实对象,因此在这种情况下,它实际上也会转换您的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函数。
上面的答案几乎是正确的。但是,使用$scope.$eval()
解析JSON字符串存在潜在问题,而JSON.parse()
或angular.fromJson()
都不存在该问题:安全性。Angular允许表达式包含复杂的JavaScript,包括函数调用、带有?:
的条件语句、变量赋值等。如果使用$scope.$eval()
,所有这些都会被识别和处理,即使它们是由恶意的最终用户添加的。
JSON不支持任何更复杂的JavaScript功能,也不支持任何其他可能"危险"的功能。如果使用像JSON.parse()
或angular.fromJson()
这样的真正JSON解析器,则不存在恶意代码被注入和执行的机会。
由于Angular表达式是孤立的,并且只在当前的$scope
中进行计算,因此代码注入的风险在一定程度上得到了缓解——$scope.$eval()
在解析JSON时远没有JavaScript的原生eval()
危险。然而,仍然没有理由为此目的使用这两个函数,因为存在潜在的安全风险,并且使用适当的JSON解析器可能会更快。
- 将函数的上下文应用于javascript变量
- 将CSS应用于printWindow.print();在Javascript中
- 如何将CSS(特别是填充/边距)应用于select下拉菜单的选项或optgroup
- $scope.apply()何时应用于angular
- Javascript非常简单:'阅读更多''显示较少'应用于Wordpress的功能
- 尝试应用于<tr>在ng单击中
- 如何将javascript仅应用于1个表单中的2个表单提交按钮中的1个
- 将脚本应用于Angular 2上的输入
- Json和$scope的角度之间的差异$eval应用于JSON字符串时
- 如何将参数应用于String.prototype.format函数
- 动态地将过滤器应用于 JSON.parse()
- $location更改不适用于ngchange,而是应用于ngclick
- 如何将 :empty 选择器应用于 XML 文档
- 如何仅在文本字段中有值时才将自定义过滤器应用于 ng-repeat
- 如何使用 JavaScript 将样式应用于 CKEditor 中的选定文本
- MongoDB 无法将$addToSet应用于 Meteor JS 中的非数组
- 将类应用于jquery ui对话框
- 将CSS应用于在JavaScript中创建的表-表的位置不正确
- 如果检查了输入,则将类应用于<身体>,没有jQuery
- 将数据表.js样式应用于 AJAX 加载的表