Как вы используете $sce.trustAsHtml(string) для репликации ng-bind-html-unsafe в Angular 1.2+
ng-bind-html-unsafe
был удален в Angular 1.2
Я пытаюсь реализовать что-то, где мне нужно использовать ng-bind-html-unsafe
. В документах и на github commit они говорят:
ng-bind-html обеспечивает ng-html-bind-небезопасное поведение (innerHTML результат без дезинфекция) при привязке к результату $sce.trustAsHtml(строка).
Как вы это делаете?
Ответы
Ответ 1
Это должно быть:
<div ng-bind-html="trustedHtml"></div>
плюс в вашем контроллере:
$scope.html = '<ul><li>render me please</li></ul>';
$scope.trustedHtml = $sce.trustAsHtml($scope.html);
вместо старого синтаксиса, где вы можете напрямую ссылаться на переменную $scope.html
:
<div ng-bind-html-unsafe="html"></div>
Как отметили несколько комментаторов, $sce
должен быть введен в контроллер, иначе вы получите ошибку $sce undefined
.
var myApp = angular.module('myApp',[]);
myApp.controller('MyController', ['$sce', function($sce) {
// ... [your code]
}]);
Ответ 2
Фильтр
app.filter('unsafe', function($sce) { return $sce.trustAsHtml; });
Использование
<ANY ng-bind-html="value | unsafe"></ANY>
Ответ 3
Лично я дезинфицирую все свои данные с некоторыми библиотеками PHP, прежде чем переходить в базу данных, поэтому мне не нужен другой фильтр XSS.
От AngularJS 1.0.8
directives.directive('ngBindHtmlUnsafe', [function() {
return function(scope, element, attr) {
element.addClass('ng-binding').data('$binding', attr.ngBindHtmlUnsafe);
scope.$watch(attr.ngBindHtmlUnsafe, function ngBindHtmlUnsafeWatchAction(value) {
element.html(value || '');
});
}
}]);
Для использования:
<div ng-bind-html-unsafe="group.description"></div>
Чтобы отключить $sce
:
app.config(['$sceProvider', function($sceProvider) {
$sceProvider.enabled(false);
}]);
Ответ 4
var line = "<label onclick="alert(1)">aaa</label>";
1. использовать фильтр
app.filter('unsafe', function($sce) { return $sce.trustAsHtml; });
используя (html):
<span ng-bind-html="line | unsafe"></span>
==>click `aaa` show alert box
2. Использовать ngSanitize: безопаснее
включить angular-sanitize.js
<script src="bower_components/angular-sanitize/angular-sanitize.js"></script>
добавить ngSanitize
в корневом каталоге angular
var app = angular.module("app", ["ngSanitize"]);
используя (html):
<span ng-bind-html="line"></span>
==>click `aaa` nothing happen
Ответ 5
Если вы хотите вернуть прежнюю директиву, вы можете добавить это в свое приложение:
Директива:
directives.directive('ngBindHtmlUnsafe', ['$sce', function($sce){
return {
scope: {
ngBindHtmlUnsafe: '=',
},
template: "<div ng-bind-html='trustedHtml'></div>",
link: function($scope, iElm, iAttrs, controller) {
$scope.updateView = function() {
$scope.trustedHtml = $sce.trustAsHtml($scope.ngBindHtmlUnsafe);
}
$scope.$watch('ngBindHtmlUnsafe', function(newVal, oldVal) {
$scope.updateView(newVal);
});
}
};
}]);
Использование
<div ng-bind-html-unsafe="group.description"></div>
Источник - https://github.com/angular-ui/bootstrap/issues/813
Ответ 6
JavaScript
$scope.get_pre = function(x) {
return $sce.trustAsHtml(x);
};
HTML
<pre ng-bind-html="get_pre(html)"></pre>
Ответ 7
Просто создание фильтра сделает трюк. (Ответил за Angular 1.6)
.filter('trustHtml', [
'$sce',
function($sce) {
return function(value) {
return $sce.trustAs('html', value);
}
}
]);
И используйте это, как описано в html.
<h2 ng-bind-html="someScopeValue | trustHtml"></h2>
Ответ 8
Для Rails (по крайней мере, в моем случае), если вы используете angularjs-rails gem, не забудьте добавить модуль sanitize
//= require angular
//= require angular-sanitize
И затем загрузите его в свое приложение...
var myDummyApp = angular.module('myDummyApp', ['ngSanitize']);
Затем вы можете сделать следующее:
В шаблоне:
%span{"ng-bind-html"=>"phone_with_break(x)"}
И в итоге:
$scope.phone_with_break = function (x) {
if (x.phone != "") {
return x.phone + "<br>";
}
return '';
}