Come si usa $ sce.trustAsHtml (stringa) per replicare ng-bind-html-unsafe in Angular 1.2+


226

ng-bind-html-unsafe è stato rimosso in Angolare 1.2

Sto cercando di implementare qualcosa in cui devo usare ng-bind-html-unsafe. Nei documenti e sul commit di github dicono:

ng-bind-html fornisce un comportamento simile a ng-html-bind-unssafe (innerHTML è il risultato senza sanitizzazione) se associato al risultato di $ sce.trustAsHtml (stringa).

Come fai a fare questo?


Risposte:


245

Dovrebbe essere:

<div ng-bind-html="trustedHtml"></div>

più nel tuo controller:

$scope.html = '<ul><li>render me please</li></ul>';
$scope.trustedHtml = $sce.trustAsHtml($scope.html);

invece della vecchia sintassi, dove è possibile fare riferimento $scope.htmldirettamente alla variabile:

<div ng-bind-html-unsafe="html"></div>

Come diversi commentatori hanno sottolineato, $scedeve essere iniettato nel controller, altrimenti si otterrà un $sce undefinederrore.

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

 myApp.controller('MyController', ['$sce', function($sce) {
    // ... [your code]
 }]);

10
Come puoi farlo con un valore restituito da una funzione? <p ng-bind-html = ""> {{description (category.id)}} </p>
dasper

2
Non sono sicuro di averti capito bene, ma: <p ng-bind-html="trustedHtml"></p> e$scope.trustedHtml = $sce.trustAsHtml(description(category.id));
Nenad,

1
Ti amo per rispondere! Apparentemente il problema sono stato io usando 1.0.8. Ho un modulo con un numero dinamico di sezioni, quindi al momento del cambiamento volevo mostrare la descrizione corretta. <p ng-bind-html="description(category.id)"></p>quindi l'ultima riga della funzione:return $sce.trustAsHtml(value);
dasper,

2
Ma ... var x = sce.trustAsHtml ('pippo'); var y = sce.trustAsHtml ('pippo'); x == y; false ... Quindi questo non dovrebbe creare un ciclo digest infinito poiché la tua funzione restituisce un nuovo oggetto?
rych,

25
Vale anche la pena ricordare che $ sce deve essere passato al controller o ottieni $ sce non definito
isimmons

634

Filtro

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

uso

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

1
Perché ti serve ngSanitizequi?

2
@OliverJosephAsh perché il servizio $ sce è definito in ngSanitize. hanno spezzato le funzionalità principali in modo da poter usare un po 'angolare e non sempre dobbiamo usare l'intero framework.
Chris Sattinger,

1
Mi chiedevo quali potrebbero essere le implicazioni di sicurezza di qualcosa del genere? Ho chiesto maggiori chiarimenti in una domanda separata . Tutti gli input sono stati apprezzati!
Philip Bulley,

9
@felix nella versione 1.2 (quando l'hanno aggiunto) è abilitato di default come parte del core, no ngSanitize, quindi non è necessariongSanitize
TheSharpieOne

2
Questa è una decisione di progettazione presa dal team angolare - ecco come devono essere implementati i filtri - se lo fai diversamente, non funzioneranno. Il motivo per cui questo deve restituire una funzione è che angolare può ritardare l'elaborazione fino a quando "trova il momento giusto". Altrimenti il ​​framework non avrebbe alcuna influenza su quando viene chiamato il filtro. È sia positivo che negativo, ma per quanto ne so - è necessario far fronte alla delicata elaborazione degli angolari. Maggiori informazioni qui: docs.angularjs.org/api/ng/provider/$filterProvider
Chris

16

Personalmente, disinfetto tutti i miei dati con alcune librerie PHP prima di accedere al database, quindi non ho bisogno di un altro filtro XSS per me.

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

Usare:

<div ng-bind-html-unsafe="group.description"></div>

Per disabilitare $sce:

app.config(['$sceProvider', function($sceProvider) {
    $sceProvider.enabled(false);
}]);

Non sono chiaro quale sia la differenza tra i due esempi. Uno dei membri del nostro team ha un problema a causa del quale System.out.println (& ldquo; Hello World! & Rdquo;); nel database. Sta usando <div data-ng-bind-html = "text"> </div> e appare sulla pagina come: System.out.println (& ldquo; Hello World! & Rdquo;) ;. Stai dicendo che l'uso della direttiva ngBindHtmlUnsafe risolverà questo problema?
Alan2,

@Alan Credo che funzionerebbe se lo fosse <script>System.out.printIn("Hello World!");</script>, non l'ho provato personalmente perché il mio PHP ha rimosso tutti i JS dall'input dell'utente. Ho rimosso il mio secondo esempio perché quello nativo di Angular è superiore in ogni modo basta usarlo.
Michael J. Calkins,

Come fare per l'editor summernote, inizialmente otterrò i dati json (che contengono html) dal server, in summernote sto usando ng-model. come rendere il codice attendibile da visualizzare nell'editor summernote
codelearner

8

var line = "<label onclick="alert(1)">aaa</label>";

1. usa il filtro

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

utilizzando (html):

<span ng-bind-html="line | unsafe"></span>
==>click `aaa` show alert box

2. usa ngSanitize: più sicuro

includere angular-sanitize.js

<script src="bower_components/angular-sanitize/angular-sanitize.js"></script>

aggiungi l' ngSanitizeapp root angolare

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

utilizzando (html):

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

Come fare per l'editor summernote, inizialmente otterrò i dati json (che contengono html) dal server, in summernote sto usando ng-model. come rendere il codice attendibile da visualizzare nell'editor summernote
codelearner

7

Semplicemente la creazione di un filtro farà il trucco. (Risposta per Angolare 1.6)

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

E usa questo come segue nell'html.

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

Questo risolve l'errore con uglifying: "Unknown provider: eProvider <- e <- unsafeFilter"
Valera Tumash

3

Se desideri ripristinare la vecchia direttiva, puoi aggiungerla alla tua app:

Direttiva:

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

uso

<div ng-bind-html-unsafe="group.description"></div>

Fonte: https://github.com/angular-ui/bootstrap/issues/813


Non si comporta allo stesso modo.
Casey,

Come fare per l'editor summernote, inizialmente otterrò i dati json (che contengono html) dal server, in summernote sto usando ng-model. come rendere il codice attendibile da visualizzare nell'editor summernote
codelearner

3

JavaScript

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

HTML

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

Come fare per l'editor summernote, inizialmente otterrò i dati json (che contengono html) dal server, in summernote sto usando ng-model. come rendere il codice attendibile da visualizzare nell'editor summernote
codelearner

1

Per Rails (almeno nel mio caso) se stai usando la gemma angularjs-rails , ricorda di aggiungere il modulo sanitize

//= require angular
//= require angular-sanitize

E poi caricalo nella tua app ...

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

Quindi è possibile effettuare le seguenti operazioni:

Sul modello:

%span{"ng-bind-html"=>"phone_with_break(x)"}

Ed eventualmente:

$scope.phone_with_break = function (x) {
  if (x.phone != "") {
   return x.phone + "<br>";
  }
  return '';
}

Come fare per l'editor summernote, inizialmente otterrò i dati json (che contengono html) dal server, in summernote sto usando ng-model. come rendere il codice attendibile da visualizzare nell'editor summernote
codelearner

Dai

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
Per favore, non pubblicare solo il codice come risposta, ma includi anche una spiegazione su cosa fa il tuo codice e su come risolve il problema della domanda. Le risposte con una spiegazione sono generalmente di qualità superiore e hanno maggiori probabilità di attrarre voti positivi.
Mark Rotteveel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.