Угловая ошибка обработки sanitize при использовании тега script в переменной
Пытаюсь применить угловое дезинфицирующее средство в моем приложении, используя угловое дезинфицирующее средство, но это не работает, как ожидалось
angular.module('sanitizeExample', ['ngSanitize'])
.controller('ExampleController', ['$scope', '$sce', function($scope, $sce) {
//$scope.snippet = "<script type='text/javascript'>alert(1)</script>";
$scope.snippet = "alert(1)";
$scope.deliberatelyTrustDangerousSnippet = function() {
return $sce.trustAsHtml($scope.snippet);
};
$scope.escape = function(input) {
return $sce.trustAsHtml(input);
}
}]);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular-sanitize.js"></script>
<div ng-app="sanitizeExample">
<div ng-controller="ExampleController">
Snippet: <textarea ng-model="snippet" cols="60" rows="3"></textarea>
<table>
<tr>
<td>Directive</td>
<td>How</td>
<td>Source</td>
<td>Rendered</td>
</tr>
<tr id="bind-html-with-sanitize">
<td>ng-bind-html</td>
<td>Automatically uses $sanitize</td>
<td><pre><div ng-bind-html="snippet"><br/></div></pre></td>
<td><div ng-bind-html="snippet"></div></td>
</tr>
<tr id="bind-html-with-trust">
<td>ng-bind-html</td>
<td>Bypass $sanitize by explicitly trusting the dangerous value</td>
<td>
<pre><div ng-bind-html="deliberatelyTrustDangerousSnippet()">
</div></pre>
</td>
<td><div ng-bind-html="deliberatelyTrustDangerousSnippet()"></div></td>
</tr>
<tr id="bind-default">
<td>ng-bind</td>
<td>Automatically escapes</td>
<td><pre><div ng-bind="snippet"><br/></div></pre></td> <td><div ng-bind="snippet">ggg</div></td>
</tr>
</table>
<p>{{ escape("<script type='text/javascript'>alert(1)</script>") }}</p>
</div>
</div>
Выдает Uncaught SyntaxError: неверная или неожиданная ошибка токена при использовании сценария
$scope.snippet = "<script type='text/javascript'>alert(1)</script>"
Отлично работает без скрипта
$scope.snippet = "alert(1)"
Он выдает предупреждение в браузере, но ожидает внутренний текст для тега p.
<p>{{ escape("<script type='text/javascript'>alert(1)</script>") }}</p>
также получить вывод в HTML
{{ побег("") }}
Как выполнить очистку переменной, которая имеет тег script, также вызвав функцию контроллера из html-шаблона.
2 ответа
Это работает?
angular.module("sanitizeExample", ['ngSanitize'])
.controller("ExampleController", ['$scope', '$sce', function($scope, $sce){
/* $scope.snippet = "alert(1)"; */
$scope.snippet = "<script " + "type='text/javascript'"+" >alert(1) <" + "/script>";
$scope.deliberatelyTrustDangerousSnippet = function(){
return $sce.trustAsHtml($scope.snippet);
};
$scope.escape = function(input) {
return $sce.trustAsHtml(input);
}
}]);
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular-sanitize.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div ng-app="sanitizeExample">
<div ng-controller="ExampleController">
Snippet: <textarea ng-model="snippet" cols="60" rows="3"></textarea>
<table>
<tr>
<td>Directive</td>
<td>How</td>
<td>Source</td>
<td>Rendered</td>
</tr>
<tr id="bind-html-with-sanitize">
<td>ng-bind-html</td>
<td>Automatically uses $sanitize</td>
<td><pre><div ng-bind-html="snippet"><br/></div></pre></td>
<td><div ng-bind-html="snippet"></div></td>
</tr>
<tr id="bind-html-with-trust">
<td>ng-bind-html</td>
<td>Bypass $sanitize by explicitly trusting the dangerous value</td>
<td>
<pre><div ng-bind-html="deliberatelyTrustDangerousSnippet()">
</div></pre>
</td>
<td><div ng-bind-html="deliberatelyTrustDangerousSnippet()"></div></td>
</tr>
<tr id="bind-default">
<td>ng-bind</td>
<td>Automatically escapes</td>
<td><pre><div ng-bind="snippet"><br/></div></pre></td> <td><div ng-bind="snippet">ggg</div></td>
</tr>
</table>
<!--
-->
<p>{{ escape("<script type='text/javascript'>alert(1)</script>") }}</p>
</div>
</div>
Только включения модуля ngSanitize достаточно, чтобы выполнить санитарную обработку в представлении.
angular.module("sanitizeExample", ['ngSanitize'])
Это не правильный способ проверки дезинфекции с точки зрения. Он передается как переменная к углу, так что он выполняет и выдает предупреждение.
{{ escape("<script type='text/javascript'>alert(1)</script>") }}
Когда мы тестируем данные, сервисы sanitize работают как положено.