Angularjs Angular.js花括号是否可以安全地显示输入字段中的用户输入?
假设我们有一个有角度的应用程序页面,其中有以下行:Angularjs Angular.js花括号是否可以安全地显示输入字段中的用户输入?,angularjs,xss,Angularjs,Xss,假设我们有一个有角度的应用程序页面,其中有以下行: <div class="item-name">{{person.FirstName}}</div> {{person.FirstName} 向下,允许用户更改名字 <md-input-container class="md-block"> <label>First name</label> <input ng-model="person.FirstName"
<div class="item-name">{{person.FirstName}}</div>
{{person.FirstName}
向下,允许用户更改名字
<md-input-container class="md-block">
<label>First name</label>
<input ng-model="person.FirstName" type="text">
</md-input-container>
名字
如果我放入任何html或顽皮的值,比如console.log(1)
div不会显示解析的输入,而是实际的字符串。这似乎很好
这安全吗
这能被利用吗?(例如,我知道运算符重载技巧——这种技巧在这里有效吗?)
我似乎找不到任何官方或值得尊敬的信息表明这是安全的、推荐的或不推荐的。官方文件中有一些提示: 通常,您不直接使用ngBind,而是使用 类似{{expression}}的双卷曲标记,类似但较少 冗长的 如果 浏览器会在其原始状态下即时显示模板 在Angular编译之前。由于ngBind是一个元素属性,因此 在加载页面时,使绑定对用户不可见 性能: {{}的速度要慢得多 这个ng绑定是一个指令,将在传递的变量上放置一个观察者。因此,只有当传递的值确实发生更改时,ng绑定才会应用 另一方面,括号将被脏检查,并在中每$digest刷新一次,即使它是不必要的 将表达式绑定到元素的双花括号符号{{}是内置的角度标记 使用它是安全的
您可以访问此处了解更多信息-$interpolateAngularJS表达式是沙盒 表达沙箱 AngularJS的表达式不是出于安全原因,而是为了保持应用程序职责的适当分离。例如,不允许访问窗口,因为这样可以很容易地在应用程序中引入脆弱的全局状态 然而,这个沙箱并不是为了阻止攻击者在Angular处理模板之前编辑模板。如果攻击者可以修改双卷曲绑定,则可能在双卷曲绑定中运行任意JavaScript 但是,如果攻击者可以更改任意HTML模板,那么没有任何东西可以阻止他们这样做:
<script>somethingEvil();</script>
somethingEvil();
最好以用户无法更改客户端模板的方式设计应用程序
例如:
- 不要混合使用客户端和服务器模板
- 不要使用用户输入动态生成模板
- 不要通过
$scope.$eval
- 考虑使用CSP(但不要只依赖CSP)
AngularJS表达式的沙盒不是出于安全原因,但沙盒确实提高了安全性。角度表达式仅限于
$scope
上的变量和函数。Angular表达式无法访问全局函数或全局变量。您可以安全地假设它是安全的,如果您需要显示html字符串,则需要使用$sce
serviceangular默认情况下保护您不受脚本注入的影响。。。所以它是安全的。@lcycool-你怎么知道呢?@Tymski你为什么不自己测试一下呢?@ehT我做了-我不是安全专家。我不确定这如何回答我关于它有多安全的问题:)这篇文章的第一句话说:AngularJS的表达式是沙盒,不是出于安全原因:/