我打算允许用户输入iframe,自定义内联样式以及其他内容。 但我想删除任何JS。
通过使用$ sanitize,我似乎删除了太多。
答案 0 :(得分:2)
如果您只想删除脚本标记,则应该执行以下操作:
angular.module('app', ['ngSanitize'])
.directive('testDir', function() {
return {
restrict: 'A',
controller: function($scope, $sce) {
$scope.sanitizeIt = function() {
var replacer = /<script>.*(<\/?script>?)?/gi;
var stripped = $scope.html.replace(replacer, '');
$scope.sanitizedHtml = $sce.trustAsHtml(stripped);
};
$scope.$watch('html', $scope.sanitizeIt);
}
};
});
正则表达式将清除所有脚本标记,$sce
告诉应用程序您可以信任被剥离为HTML的字符串。
在您的应用程序中,您可以编写如下内容:
<body ng-app="app">
<div test-dir>
<textarea ng-model="html"></textarea>
<div ng-bind-html="sanitizedHtml"></div>
</div>
</body>
当您持久保存到数据库时,请确保保存已清理的HTML字符串而不是html。
以下是$sce
的更多文档:
https://docs.angularjs.org/api/ng/service/ $ SCE
它基本上是$sanitize
在幕后使用的内容。注意:除了Chrome之外,我还没有在浏览器中测试过这个正则表达式,因此您可能需要进行一些自己的调整才能使其适合您的需求。但是,这个想法是一样的。