Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs Angular.js花括号是否可以安全地显示输入字段中的用户输入?_Angularjs_Xss - Fatal编程技术网

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刷新一次,即使它是不必要的

将表达式绑定到元素的双花括号符号{{}是内置的角度标记

使用它是安全的
您可以访问此处了解更多信息-$interpolate

AngularJS表达式是沙盒

表达沙箱 AngularJS的表达式不是出于安全原因,而是为了保持应用程序职责的适当分离。例如,不允许访问窗口,因为这样可以很容易地在应用程序中引入脆弱的全局状态

然而,这个沙箱并不是为了阻止攻击者在Angular处理模板之前编辑模板。如果攻击者可以修改双卷曲绑定,则可能在双卷曲绑定中运行任意JavaScript

但是,如果攻击者可以更改任意HTML模板,那么没有任何东西可以阻止他们这样做:

<script>somethingEvil();</script>
somethingEvil();
最好以用户无法更改客户端模板的方式设计应用程序

例如:

  • 不要混合使用客户端和服务器模板
  • 不要使用用户输入动态生成模板
  • 不要通过
    $scope.$eval
  • 考虑使用CSP(但不要只依赖CSP)
有关详细信息,请参阅


AngularJS表达式的沙盒不是出于安全原因,但沙盒确实提高了安全性。角度表达式仅限于
$scope
上的变量和函数。Angular表达式无法访问全局函数或全局变量。

您可以安全地假设它是安全的,如果您需要显示html字符串,则需要使用
$sce
serviceangular默认情况下保护您不受脚本注入的影响。。。所以它是安全的。@lcycool-你怎么知道呢?@Tymski你为什么不自己测试一下呢?@ehT我做了-我不是安全专家。我不确定这如何回答我关于它有多安全的问题:)这篇文章的第一句话说:AngularJS的表达式是沙盒,不是出于安全原因:/