Angular 1.2 이상에서 ng-bind-html-unsafe를 복제하기 위해 $ sce.trustAsHtml (string)을 어떻게 사용합니까?


226

ng-bind-html-unsafe Angular 1.2에서 제거되었습니다

사용할 필요가있는 것을 구현하려고합니다 ng-bind-html-unsafe. 문서와 github commit에서 그들은 말합니다 :

ng-bind-html은 $ sce.trustAsHtml (string)의 결과에 바인딩 될 때 ng-html-bind-unsafe와 같은 동작 (내 HTML이 위생 처리되지 않은 결과)을 제공합니다.

어떻게합니까?


답변:


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));
Nenad

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'); x == y; false ... 함수가 새로운 객체를 반환하기 때문에 무한 다이제스트 루프를 생성해서는 안됩니까?
rych

25
또한 언급 할 가치가있는 것은 $ sce가 컨트롤러에 전달되거나 $ sce가 정의되지 않은 것입니다
isimmons

633

필터

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

용법

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

1
ngSanitize여기에 필요 합니까?

2
$ sce 서비스가 ngSanitize에 정의되어 있기 때문에 @OliverJosephAsh. 주요 기능을 분리하여 각도를 조금만 사용할 수 있으며 항상 전체 프레임 워크를 사용할 필요는 없습니다.
Chris Sattinger

1
이와 같은 보안의 의미가 무엇인지 궁금합니다. 별도의 질문 에서 더 자세한 설명을 요청했습니다 . 모든 의견을 부탁드립니다!
Philip Bulley

9
1.2 버전의 @felix (추가 할 때)는 기본적으로 코어의 일부로 사용되지 ngSanitize않으므로 필요하지 않습니다.ngSanitize
TheSharpieOne

2
이것은 각진 팀에 의해 만들어진 디자인 결정입니다-필터가 어떻게 구현되어야 하는가 – 그렇지 않으면 필터가 작동하지 않습니다. 이것이 함수를 반환 해야하는 이유는 각도가 '적절한 순간을 찾을'때까지 처리를 지연시킬 수 있기 때문입니다. 그렇지 않으면 필터가 호출 될 때 프레임 워크에 영향을 미치지 않습니다. 그것은 좋고 나쁘지만, 내가 알 수있는 한 각도의 까다로운 처리에 대처해야합니다. 자세한 정보는 여기 : docs.angularjs.org/api/ng/provider/$filterProvider
Chris

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

@ Alan <script>System.out.printIn("Hello World!");</script>내 PHP가 사용자 입력에서 모든 JS를 제거했기 때문에 개인적으로 시도하지 않은 경우 작동한다고 생각합니다 . Angular의 네이티브 예제는 모든면에서 우수하기 때문에 두 번째 예제를 제거했습니다.
Michael J. Calkins

summernote 편집기 에서이 작업을 수행하는 방법은 처음에 ng-model을 사용하는 summernote의 서버에서 json 데이터 (html을 포함하는)를 가져옵니다. summernote 편집기에 표시 할 신뢰할 수있는 코드를 만드는 방법
codelearner

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 편집기 에서이 작업을 수행하는 방법은 처음에 ng-model을 사용하는 summernote의 서버에서 json 데이터 (html을 포함하는)를 가져옵니다. summernote 편집기에 표시 할 신뢰할 수있는 코드를 만드는 방법
codelearner

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"
Valera Tumash

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


동일하게 동작하지 않습니다.
Casey

summernote 편집기 에서이 작업을 수행하는 방법은 처음에 ng-model을 사용하는 summernote의 서버에서 json 데이터 (html을 포함하는)를 가져옵니다. summernote 편집기에서 코드를 신뢰할 수있는 것으로 표시하는 방법
codelearner

3

자바 스크립트

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

HTML

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

summernote 편집기 에서이 작업을 수행하는 방법은 처음에 ng-model을 사용하는 summernote의 서버에서 json 데이터 (html을 포함하는)를 가져옵니다. summernote 편집기에 표시 할 신뢰할 수있는 코드를 만드는 방법
codelearner

1

들어 레일 당신이 사용하는 경우 (내 경우에는 적어도) 보석 - 레일 AngularJS와을 의 살균 모듈을 추가하는 것을 기억하십시오

//= 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 편집기 에서이 작업을 수행하는 방법은 처음에 ng-model을 사용하는 summernote의 서버에서 json 데이터 (html을 포함하는)를 가져옵니다. summernote 편집기에서 코드를 신뢰할 수있는 것으로 표시하는 방법
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
코드를 답변으로 게시하지 말고 코드의 기능과 질문의 문제를 해결하는 방법에 대한 설명도 포함하십시오. 설명이 포함 된 답변은 일반적으로 품질이 높으며 투표를 유도 할 가능성이 높습니다.
Mark Rotteveel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.