Как использовать $ sce.trustAsHtml (string) для репликации ng-bind-html-unsafe в Angular 1.2+


226

ng-bind-html-unsafe был удален в Angular 1.2

Я пытаюсь реализовать то, что мне нужно использовать ng-bind-html-unsafe. В документах и ​​на комитете github говорится:

ng-bind-html обеспечивает поведение, подобное ng-html-bind-unsafe (innerHTML - результат без очистки), когда привязано к результату $ sce.trustAsHtml (string).

Как ты делаешь это?


Ответы:


245

Которые должны быть:

<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]
 }]);

10
Как вы можете сделать это со значением, возвращаемым функцией? <p ng-bind-html = ""> {{description (category.id)}} </ p>
dasper

2
Не уверен, правильно ли я вас понял, но: <p ng-bind-html="trustedHtml"></p> и$scope.trustedHtml = $sce.trustAsHtml(description(category.id));
Ненад

1
Я люблю тебя за ответ! Видимо проблема была у меня с использованием 1.0.8. У меня есть форма с динамическим количеством разделов, поэтому при изменении я хотел показать правильное описание. <p ng-bind-html="description(category.id)"></p>затем последняя строка функции:return $sce.trustAsHtml(value);
dasper

2
Но ... var x = sce.trustAsHtml ('foo'); var y = sce.trustAsHtml ('foo'); х == у; false ... Так не должно ли это создать бесконечный дайджест-цикл, поскольку ваша функция возвращает новый объект?
rych

25
Также стоит упомянуть, что $ sce необходимо передать в контроллер, или вы получите, что $ sce не определено
isimmons

634

Фильтр

app.filter('unsafe', function($sce) { return $sce.trustAsHtml; });

использование

<ANY ng-bind-html="value | unsafe"></ANY>

1
Зачем тебе ngSanitizeздесь?

2
@OliverJosephAsh, потому что служба $ sce определена в ngSanitize. они разбили основные функциональные возможности, поэтому мы можем использовать угловые лишь немного и не всегда приходится использовать весь фреймворк.
Крис Саттингер

1
Мне было интересно, каковы могут быть последствия для безопасности чего-то подобного? Я попросил разъяснений в отдельном вопросе . Все отзывы приветствуются!
Филипп Булли

9
@felix в версии 1.2 (когда они добавили это), он включен по умолчанию как часть ядра, нет ngSanitize, поэтому в этом нет необходимостиngSanitize
TheSharpieOne

2
Это дизайнерское решение, принятое командой разработчиков углов - именно так должны быть реализованы фильтры - если вы сделаете это иначе, они не будут работать. Причина, по которой это должно возвращать функцию, заключается в том, что angular может задерживать обработку до тех пор, пока он «не найдет нужный момент». В противном случае структура не будет иметь никакого влияния на то, когда вызывается фильтр. Это и хорошо, и плохо, но, насколько я могу судить, нужно справиться с хитрой обработкой угловых. Более подробная информация здесь: docs.angularjs.org/api/ng/provider/$filterProvider
Крис

16

Лично я очищаю все свои данные с помощью некоторых 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);
}]);

Мне неясно, в чем разница между этими двумя примерами. У одного из членов нашей команды есть проблема, когда у него есть System.out.println (& ldquo; Hello World! & Rdquo;); в базе данных. Она использует <div data-ng-bind-html = "text"> </ div> и отображается на странице как: System.out.println (& ldquo; Hello World! & Rdquo;) ;. Вы хотите сказать, что использование вашей директивы ngBindHtmlUnsafe решит эту проблему?
Alan2

@ Алан Я думаю, что это будет работать, если бы это было так <script>System.out.printIn("Hello World!");</script>, не пробовал это лично, потому что мой PHP удалил все JS из пользовательского ввода. Я удалил свой второй пример, потому что родной Angular превосходен во всех отношениях, просто используйте этот.
Майкл Дж. Калкинс

Как это сделать для редактора summernote, сначала я получу данные json (которые содержат html) с сервера, в summernote я использую ng-модель. как сделать код в качестве доверенного для отображения в редакторе
summernote

8

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в корень угловое приложение

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

используя (HTML):

<span ng-bind-html="line"></span>
==>click `aaa` nothing happen

Как это сделать для редактора summernote, сначала я получу данные json (которые содержат html) с сервера, в summernote я использую ng-модель. как сделать код в качестве доверенного для отображения в редакторе
summernote

7

Простое создание фильтра поможет. (Ответили за угловой 1.6)

.filter('trustHtml', [
        '$sce',
        function($sce) {
            return function(value) {
                return $sce.trustAs('html', value);
            }
        }
    ]);

И используйте это как следовать в HTML.

<h2 ng-bind-html="someScopeValue | trustHtml"></h2>

Эта ошибка исправляет ошибку: «Неизвестный поставщик: eProvider <- e <- unsafeFilter»
Валера Тумаш,

3

Если вы хотите вернуть старую директиву, вы можете добавить это в свое приложение:

Директива:

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


Не ведет себя так же.
Кейси

Как это сделать для редактора summernote, сначала я получу данные json (которые содержат html) с сервера, в summernote я использую ng-модель. как сделать код в качестве доверенного для отображения в редакторе
summernote

3

JavaScript

$scope.get_pre = function(x) {
    return $sce.trustAsHtml(x);
};

HTML

<pre ng-bind-html="get_pre(html)"></pre>

Как это сделать для редактора summernote, сначала я получу данные json (которые содержат html) с сервера, в summernote я использую ng-модель. как сделать код в качестве доверенного для отображения в редакторе
summernote

1

Для Rails (по крайней мере, в моем случае), если вы используете гем angularjs-rails , пожалуйста, не забудьте добавить модуль 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 '';
}

Как это сделать для редактора summernote, сначала я получу данные json (которые содержат html) с сервера, в summernote я использую ng-модель. как сделать код в качестве доверенного для отображения в редакторе
summernote


0
my helpful code for others(just one aspx to do text area post)::

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication45.WebForm1" %>

<!DOCTYPE html>

    enter code here

<html ng-app="htmldoc" xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="angular.min.js"></script>
    <script src="angular-sanitize.min.js"></script>
    <script>
        angular.module('htmldoc', ['ngSanitize']).controller('x', function ($scope, $sce) {
            //$scope.htmlContent = '<script> (function () { location = \"http://moneycontrol.com\"; } )()<\/script> In last valid content';
            $scope.htmlContent = '';
            $scope.withoutSanitize = function () {
                return $sce.getTrustedHtml($scope.htmlContent);
            };
            $scope.postMessage = function () {
                var ValidContent = $sce.trustAsHtml($scope.htmlContent);

                //your ajax call here
            };
        });
    </script>
</head>
<body>
    <form id="form1" runat="server">
        Example to show posting valid content to server with two way binding
        <div ng-controller="x">
            <p ng-bind-html="htmlContent"></p>
            <textarea ng-model="htmlContent" ng-trim="false"></textarea>
            <button ng-click="postMessage()">Send</button>
        </div>
    </form>
</body>
</html>

0
$scope.trustAsHtml=function(scope)
{
    return $sce.trustAsHtml(scope);
}
<p class="card-text w-100" ng-bind-html="trustAsHtml(note.redoq_csd_product_lead_note)"></p>

3
Пожалуйста, не публикуйте только код в качестве ответа, но также включайте объяснение того, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением, как правило, более высокого качества и, скорее всего, привлекут положительные отзывы.
Марк Роттвил
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.