Açısal 1.2+'de ng-bind-html-unsafe çoğaltmak için $ sce.trustAsHtml (string) nasıl kullanılır


226

ng-bind-html-unsafe Açısal 1.2'de kaldırıldı

Kullanmam gereken bir şey uygulamaya çalışıyorum ng-bind-html-unsafe. Dokümanlar ve github taahhüdünde şunları söylüyorlar:

ng-bind-html, $ sce.trustAsHtml (string) sonucuna bağlandığında ng-html-bind-güvensiz gibi bir davranış (innerHTML'ler dezenfekte edilmeden sonuç) sağlar.

Bunu nasıl yapıyorsun?


Yanıtlar:


246

O olmalı:

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

artı kumandanızda:

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

$scope.htmldeğişkene doğrudan başvurabileceğiniz eski sözdizimi yerine :

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

Birkaç yorumcunun işaret $sceettiği gibi, kontrolöre enjekte edilmesi gerekir, aksi takdirde $sce undefinedhata alırsınız .

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

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

10
Bunu bir işlev tarafından döndürülen bir değerle nasıl yapabilirsiniz? <p ng-bind-html = ""> {{description (category.id)}} </p>
dasper

2
Seni doğru anladığımdan emin değilim, ama: <p ng-bind-html="trustedHtml"></p> ve$scope.trustedHtml = $sce.trustAsHtml(description(category.id));
Nenad

1
Yanıt verdiğin için seni seviyorum! Görünüşe göre sorun 1.0.8 kullanmaktı. Dinamik sayıda bölüm içeren bir form var, bu yüzden değişimde uygun açıklamayı göstermek istedim. <p ng-bind-html="description(category.id)"></p>sonra işlevin son satırı:return $sce.trustAsHtml(value);
dasper

2
Ama ... var x = sce.trustAsHtml ('foo'); var y = sce.trustAsHtml ('foo'); X == Y; false ... Peki, işleviniz yeni bir nesne döndürdüğü için bu sonsuz bir özet döngüsü oluşturmamalı mı?
rych

25
Ayrıca bahsetmeye değer $ sce denetleyiciye geçirilmesi gerekiyor ya da $ sce tanımlı değil
isimmons

634

filtre

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

kullanım

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

1
Neden ngSanitizeburaya ihtiyacın var?

2
@OliverJosephAsh çünkü $ sce hizmeti ngSanitize içinde tanımlanmıştır. onlar büyük işlevselliği parçaladılar, böylece biraz açısal kullanabiliyoruz ve her zaman tüm çerçeveyi kullanmak zorunda kalmıyoruz.
Chris Sattinger

1
Böyle bir şeyin güvenlik üzerindeki etkilerinin ne olabileceğini merak ediyordum. Ayrı bir soruda daha fazla açıklama istedim . Tüm girdiler takdir edildi!
Philip Bulley

9
1.2 sürümünde @felix (bunu eklediklerinde) varsayılan olarak çekirdeğin bir parçası olarak etkinleştirilir, değil ngSanitize, bu yüzden gerek yokturngSanitize
TheSharpieOne

2
Bu, açısal ekip tarafından verilen bir tasarım kararıdır - filtreler bu şekilde uygulanmalıdır - aksi takdirde yaparsanız çalışmazlar. Bunun bir işlevi döndürmesi gerekmesinin nedeni, açısalın 'doğru anı bulana kadar işlemi geciktirebilmesidir. Aksi takdirde, çerçevenin filtrenin çağrılması üzerinde herhangi bir etkisi olmaz. Bu hem iyi hem de kötü, ama anlayabildiğim kadarıyla - açısalların zor işlemeleri ile başa çıkmak gerekiyor. Daha fazla bilgi için: docs.angularjs.org/api/ng/provider/$filterProvider
Chris

16

Şahsen ben veritabanına gitmeden önce tüm verilerimi bazı PHP kütüphaneleri ile dezenfekte ediyorum, bu yüzden benim için başka bir XSS filtresine gerek yok.

AngularJS 1.0.8'den

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

Kullanmak:

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

Devre dışı bırakmak için $sce:

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

İki örnek arasındaki farkın ne olduğu belli değil. Ekip üyelerimizden birinin System.out.println (& ldquo; Merhaba Dünya! & Rdquo;); veritabanında. <Div data-ng-bind-html = "text"> </div> kullanıyor ve sayfada şu şekilde görünüyor: System.out.println (& ldquo; Hello World! & Rdquo;) ;. NgBindHtmlUnsafe yönergesini kullanmanın bu sorunu çözeceğini mi söylüyorsun?
Alan2

@Alan <script>System.out.printIn("Hello World!");</script>, PHP'nin kullanıcı girişinden tüm JS'leri kaldırdığı için bu kişisel olarak denemediğini düşünüyorum. İkinci örneğimi kaldırdım çünkü Angular'ın doğal olanı her şekilde üstündür.
Michael J.Calkins

Summernote editörü için bunu yapmak için, başlangıçta ben ng-model kullanıyorum summernote sunucudan json verileri (html içeren) alacak. summernote editöründe görüntülemek için güvenilir kod nasıl yapılır
codelearner

8

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

1. filtre kullanın

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

(html) kullanarak:

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

2. ngSanitize kullanın: daha güvenli

Dahil etmek angular-sanitize.js

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

ngSanitizeKök açısal uygulamaya ekle

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

(html) kullanarak:

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

Summernote editörü için bunu yapmak için, başlangıçta ben ng-model kullanıyorum summernote sunucudan json verileri (html içeren) alacak. summernote editöründe görüntülemek için güvenilir kod nasıl yapılır
codelearner

7

Sadece bir filtre oluşturmak işinizi görecektir. (Açısal 1.6 için cevaplanmıştır)

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

Ve html'de aşağıdaki gibi kullanın.

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

Bu, uglifying ile hatayı düzeltir: "Bilinmeyen sağlayıcı: eProvider <- e <- unsafeFilter"
Valera Tumash

3

Eski yönergeyi geri almak istiyorsanız, bunu uygulamanıza ekleyebilirsiniz:

Direktif:

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

kullanım

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

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


Aynı şekilde davranmaz.
Casey

Summernote editörü için bunu yapmak için, başlangıçta ben ng-model kullanıyorum summernote sunucudan json verileri (html içeren) alacak. summernote editöründe gösterilecek kodu güvenilir yapmak
codelearner

3

JavaScript

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

HTML

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

Summernote editörü için bunu yapmak için, başlangıçta ben ng-model kullanıyorum summernote sunucudan json verileri (html içeren) alacak. summernote editöründe görüntülemek için güvenilir kod nasıl yapılır
codelearner

1

İçin Raylar kullandığınız takdirde (benim durumumda en azından) mücevher-raylar angularjs sterilize modülü eklemeyi unutmayın lütfen

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

Ve sonra uygulamanıza yükleyin ...

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

Sonra aşağıdakileri yapabilirsiniz:

Şablonda:

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

Ve sonunda:

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

Summernote editörü için bunu yapmak için, başlangıçta ben ng-model kullanıyorum summernote sunucudan json verileri (html içeren) alacak. summernote editöründe gösterilecek kodu güvenilir yapmak
codelearner


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
Lütfen yalnızca kodu yanıt olarak yayınlamayın, aynı zamanda kodunuzun ne yaptığını ve sorunun sorununu nasıl çözdüğünü de açıklayın. Açıklamalı cevaplar genellikle daha yüksek kalitededir ve yukarı oy alma olasılığı daha yüksektir.
Mark Rotteveel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.