Angular.js花括号是否可以安全地显示来自输入字段的用户输入?

时间:2016-08-03 04:11:35

标签: angularjs xss

假设我们的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不会显示解析的输入,而是显示实际的字符串。这似乎很好。

这根本安全吗?

这可以被利用吗? (例如,我知道运算符重载技巧 - 这样的技巧会在这里工作吗?)

我似乎无法找到任何官方或尊重的信息,表明这是安全的,推荐的或不推荐的。

2 个答案:

答案 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