如何使用$ watch突破Angularjs?

时间:2016-12-28 12:57:47

标签: angularjs security

在angular js安全文档中,使用$ watch编写用于监视用户生成内容的值是不安全的:

  

可以通过多种方式控制模板和表达式:...

     

在对作用域的以下方法的调用中传递从用户提供的内容生成的表达式:   ...

     

$ watch(userContent,...)

userContent在这里是什么意思?如果我看用户输入字段的ngModel值,这是一个userContent吗?小提琴中的形式不安全吗?

2 个答案:

答案 0 :(得分:3)

$watch表达式是eval 的限制形式,其中表达式由AngularJS表达式解析器解析并针对当前作用域进行评估。

虽然AngularJS表达式解析器具有针对使用真实eval评估任意JS代码的安全措施,但安全隐患可能仍然存在,并且已知漏洞可能在旧框架版本中被利用。

这意味着无法评估$on.constructor('alert(1)')()表达式,也不会在任何最新的AngularJS版本中创建安全威胁。但考虑到$window服务已暴露于范围(这是ES6控制器的常见做法),可以评估$window.alert(1)表达式。

无法构成安全威胁:

$scope.$watch('myValue', function () {
    console.log($scope.myValue);
});

可以造成安全威胁:

$scope.$watch($scope.myValue, function () {
    console.log($scope.myValue);
});

答案 1 :(得分:0)

使用$ watch,您可以关注任何ng型号。例如,您有一张图表及以上图表,您可以获得年初至今,月至今,季度至今的下拉列表。 现在说,下拉模型的名称是dateChange 现在你可以在dateChange上监视,所以每当dateChange有更新时,$ watch函数就会知道,你可以根据选择更新图表的数据