安全 Angular JS 表达式

Secure Angular JS expressions

我正在编辑一个现有代码,其中有很多 angular js 表达式,我们的自动测试系统检测到这些表达式不安全。我能够看到下面描述我的案例的文章,但我无法找到任何具体的方法来解决它(我主要看到 $watch 和 $apply)。我想我在这里需要知道的是我在哪里修改代码?

相关链接:

http://blog.angularjs.org/2016/09/angular-16-expression-sandbox-removal.html https://docs.angularjs.org/guide/security#angularjs-templates-and-expressions

我的代码示例片段:

您的代码看起来非常完美。我认为您缺少的是该警告的“传递用户提供的内容”部分。

在第一个示例中,您唯一传递给 $apply 的是您定义的函数,与第二个示例相同。在最后一个示例中,您没有将任何内容传递给 $apply.

他们有这些警告的原因是因为 $apply 可以传递一个字符串来计算 $scope 上的表达式。

以同样的方式

{{$scope.hello = 'Hello, World'}}

将设置 $scope

的 hello 属性
$scope.$apply('hello = "Hello, World"') 

会做同样的事情。现在假设您将用户定义的内容传递给 this

$scope.$apply(userPassedString)

现在您已授予用户在应用函数中 运行 任意 javascript 表达式的能力。

为了准确理解我的意思(以及它是如何被利用的),我在这里为您创建了一个代码笔演示:https://codepen.io/codymikol/pen/bGbzbvp

(你必须在 HTML 中向下滚动才能看到脚本,我很懒所以没有 link 它作为一个单独的 JS 文件 \_('__') _/

此外,如果您真的想了解上面的代码片段是如何运行的(以及我从哪里了解到以这种方式获取函数构造函数的),您应该通过 liveoverflow 观看此视频:https://www.youtube.com/watch?v=DkL3jaI1cj0

这是在 AngularJS 团队试图围绕范围表达式创建沙箱以防止 XSS 时做出的。有很多视频详细介绍了人们用来绕过沙箱的不同漏洞利用。由于创建沙箱非常复杂且被利用的频率很高,他们决定将其完全删除,并警告开发人员不要以这种方式传递用户内容。