angularjs在ng-model上消毒

时间:2016-01-20 20:53:40

标签: javascript angularjs angular-ngmodel angularjs-ng-model html-escape-characters

我在服务器端使用AntiXss Encoder进行XSS攻击,因此所有响应都包含html unescape字符,如“& lt:script& gt:alert(1);& lt:/ script& gt:”(替换';'为':')

关于绑定我使用sanitize和 ng-bind-html 没有问题。 更新模式还有另一个控制输入。当用户需要更新文本时,他们点击更新图标然后我显示textarea并隐藏带有 ng-if 的绑定标签。 textarea有 ng-model attr。我不能逃脱textarea上的html字符,如 ng-bind-html 这里是片段请帮助我变得狡猾..

小提琴;编辑模式textarea必须显示“< script> alert(1);< / script> ”,没有任何警报操作,并且数据将被发送到服务器也必须显示相同...

here is the fiddle

var app = angular.module('myApp',['ngSanitize']);

app.controller('MyCtrl', function($scope, $sce, $sanitize) {
    $scope.post1 = "<script>alert(1);</script>";
    //$scope.post2 = $sce.parseAsHtml("<h1>alert(1)</h1>");
    $scope.logs = ["log created"];
    $scope.log = function(val){
    	$scope.logs.push(val);
    }
});
.label {
  text-decoration:underline;
  color:red;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-sanitize.min.js"></script>

<div ng-app="myApp">
  <div ng-controller="MyCtrl">
      <div class="label">Edit mode :</div>
      <textarea ng-model="post1" style="width:100%;" rows="5"></textarea><br />
      <div class="label">Binding mode :</div>
      <div ng-bind-html="post1"></div><br />
      <div class="label">Data will be send to the server :</div>
      <div>{{post1}}</div><br />
      <div class="label">Logs (if needed) :</div>
      <div ng-repeat="d in logs">
        <p>{{($index+1) + ". " + d}}</p>
      </div>
</div>
</div>

1 个答案:

答案 0 :(得分:1)

您拥有$ sanitize服务,但它看起来并不像您使用它。这样:

$scope.post1 = "&lt;script&gt;alert(1);&lt;/script&gt;";

应该看起来像这样:

$scope.post1 = $sanitize("&lt;script&gt;alert(1);&lt;/script&gt;";)

此外,$ sanitize不是核心Angular包的一部分。如果您还没有这样做,则需要包含angular-sanitize.js并在ngSanitize模块上添加依赖项: var app = angular.module('myApp', ["ngSanitize"]);