假设我们的Angular应用页面包含以下行:
<div class="item-name">{{person.FirstName}}</div>
降低用户可以更改名字。
<md-input-container class="md-block">
<label>First name</label>
<input ng-model="person.FirstName" type="text">
</md-input-container>
如果我输入任何html或淘气的值,例如<script>console.log(1)</script>
,则div不会显示解析的输入,而是显示实际的字符串。这似乎很好。
这根本安全吗?
这可以被利用吗? (例如,我知道运算符重载技巧 - 这样的技巧会在这里工作吗?)
我似乎无法找到任何官方或尊重的信息,表明这是安全的,推荐的或不推荐的。
答案 0 :(得分:1)
AngularJS表达式是沙盒。
Expression Sandboxing
AngularJS的表达式是沙箱,不是出于安全原因,而是为了保持应用程序职责的适当分离。例如,不允许访问窗口,因为它可以很容易地将脆弱的全局状态引入应用程序。
但是,此沙箱并非旨在阻止可以在Angular处理模板之前编辑模板的攻击者。如果攻击者可以修改它们,则可以在双卷曲绑定中运行任意JavaScript。
但是如果攻击者可以更改任意HTML模板,那么就没有什么可以阻止他们这样做了:
<script>somethingEvil();</script>
以用户无法更改客户端模板的方式设计应用程序会更好。
例如:
- 不要混用客户端和服务器模板
- 不要使用用户输入动态生成模板
- 不要通过
运行用户输入$scope.$eval
- 考虑使用CSP(但不要只依赖CSP)
有关详细信息,请参阅AngularJS Developer Guide - Security - Expression Sandboxing
AngularJS表达式是沙箱,不是出于安全原因,但沙盒确实增加了安全性。角度表达式仅限于$scope
上的变量和函数。 Angular Expressions无法访问全局函数或全局变量。
答案 1 :(得分:0)
官方文档中有一些提示:https://docs.angularjs.org/api/ng/directive/ngBind
通常,您不直接使用ngBind,而是使用 双重卷曲标记,如{{expression}},类似但更少 冗长。
如果a,最好使用ngBind而不是{{expression}} 浏览器在其原始状态下暂时显示模板 在Angular编译之前。由于ngBind是一个元素属性,它 在页面加载时使绑定对用户不可见。
<强>性能:强>
{{}}要慢得多。
这个ng-bind是一个指令,它会在传递的变量上放置一个观察者。因此,只有当传递的值确实改变时,ng-bind才会适用。
另一方面,括号将脏检查并在每个 $摘要中刷新,即使不必要。
将表达式绑定到元素的双花括号符号{{}}是内置的Angular标记。
使用安全 您可以在这里访问更多信息 - https://docs.angularjs.org/api/ng/service/ $ interpolate