Làm thế nào để bạn sử dụng $ sce.trustAsHtml (chuỗi) để sao chép ng-bind-html-không an toàn trong Angular 1.2+


226

ng-bind-html-unsafe đã bị xóa trong Angular 1.2

Tôi đang cố gắng thực hiện một cái gì đó mà tôi cần sử dụng ng-bind-html-unsafe. Trong các tài liệu và trên github cam kết họ nói:

ng-bind-html cung cấp hành vi giống như ng-html-bind-không an toàn (bên trongHTML là kết quả mà không cần khử trùng) khi bị ràng buộc với kết quả của $ sce.trustAsHtml (chuỗi).

Làm thế nào để bạn làm điều này?


Câu trả lời:


245

Đó phải là:

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

cộng trong bộ điều khiển của bạn:

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

thay vì cú pháp cũ, nơi bạn có thể tham chiếu $scope.htmlbiến trực tiếp:

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

Như một số bình luận đã chỉ ra, $scephải được đưa vào bộ điều khiển, nếu không bạn sẽ gặp $sce undefinedlỗi.

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

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

10
Làm thế nào bạn có thể làm điều này với một giá trị được trả về bởi một hàm? <p ng-bind-html = ""> {{description (category.id)}} </ p>
dasper

2
Không chắc chắn nếu tôi hiểu đúng về bạn, nhưng: <p ng-bind-html="trustedHtml"></p>$scope.trustedHtml = $sce.trustAsHtml(description(category.id));
Nenad

1
Tôi yêu bạn đã trả lời! Rõ ràng vấn đề là tôi sử dụng 1.0.8. Tôi có một biểu mẫu với số phần động nên khi thay đổi tôi muốn hiển thị mô tả thích hợp. <p ng-bind-html="description(category.id)"></p>sau đó là dòng cuối cùng của chức năng:return $sce.trustAsHtml(value);
dasper

2
Nhưng ... var x = sce.trustAsHtml ('foo'); var y = sce.trustAsHtml ('foo'); x == y; sai ... Vì vậy, điều này không nên tạo ra một vòng lặp tiêu hóa vô hạn vì hàm của bạn trả về một đối tượng mới?
rych

25
Một điều đáng nói nữa là $ sce cần được chuyển vào bộ điều khiển hoặc bạn không nhận được $
sce

633

Bộ lọc

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

Sử dụng

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

1
Tại sao bạn cần ngSanitizeở đây?

2
@OliverJosephAsh vì dịch vụ $ sce được xác định trong ngSanitize. chúng đã phá vỡ chức năng chính để chúng ta có thể sử dụng góc cạnh một chút và không phải lúc nào cũng phải sử dụng toàn bộ khung.
Chris Sattinger

1
Tôi đã tự hỏi ý nghĩa bảo mật của một cái gì đó như thế này có thể là gì? Tôi đã yêu cầu làm rõ hơn trong một câu hỏi riêng biệt . Tất cả đầu vào đánh giá cao!
Philip Bulley

9
@felix trong phiên bản 1.2 (khi họ thêm cái này), nó được bật theo mặc định như một phần của lõi, không ngSanitize, vì vậy không cần thiếtngSanitize
TheSharpieOne

2
Đây là một quyết định thiết kế được đưa ra bởi nhóm góc cạnh - đó là cách các bộ lọc nên được thực hiện - nếu bạn làm khác, chúng sẽ không hoạt động. Lý do tại sao điều này phải trả về một hàm là vì góc có thể trì hoãn xử lý cho đến khi nó 'tìm đúng thời điểm'. Nếu không, khung sẽ không có bất kỳ ảnh hưởng nào khi bộ lọc được gọi. Điều đó tốt và xấu, nhưng theo như tôi có thể nói - cần phải đối phó với cách xử lý khó khăn của các ống kính. Thêm thông tin ở đây: docs.angularjs.org/api/ng/provider/$filterProvider
Chris

16

Cá nhân tôi vệ sinh tất cả dữ liệu của mình với một số thư viện PHP trước khi đi vào cơ sở dữ liệu để không cần bộ lọc XSS khác cho tôi.

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

Để sử dụng:

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

Để tắt $sce:

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

Tôi không rõ sự khác biệt giữa hai ví dụ. Một trong những thành viên trong nhóm của chúng tôi gặp sự cố khi họ có System.out.println (& ldquo; Hello World! & Rdquo;); trong cơ sở dữ liệu. Cô ấy đang sử dụng <div data-ng-bind-html = "text"> </ div> và nó xuất hiện trên trang dưới dạng: System.out.println (& ldquo; Hello World! & Rdquo;);. Bạn đang nói rằng sử dụng chỉ thị ngBindHtmlUnsafe của bạn sẽ khắc phục vấn đề này?
Alan2

@Alan Tôi tin rằng nó sẽ hoạt động nếu có <script>System.out.printIn("Hello World!");</script>, tôi đã không thử cá nhân này vì PHP của tôi đã xóa tất cả JS khỏi đầu vào của người dùng. Tôi đã loại bỏ ví dụ thứ hai của mình bởi vì bản địa của Angular vượt trội hơn về mọi mặt chỉ sử dụng cái đó.
Michael J. Calkins

Làm thế nào để làm điều này cho trình soạn thảo summernote, ban đầu tôi sẽ lấy dữ liệu json (có chứa html) từ máy chủ, trong summernote tôi đang sử dụng ng-model. làm thế nào để làm cho mã được tin cậy để hiển thị trong trình soạn thảo
summernote

8

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

1. sử dụng bộ lọc

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

sử dụng (html):

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

2. sử dụng ngSanitize: an toàn hơn

bao gồm angular-sanitize.js

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

thêm ngSanitizevào ứng dụng góc gốc

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

sử dụng (html):

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

Làm thế nào để làm điều này cho trình soạn thảo summernote, ban đầu tôi sẽ lấy dữ liệu json (có chứa html) từ máy chủ, trong summernote tôi đang sử dụng ng-model. làm thế nào để làm cho mã được tin cậy để hiển thị trong trình soạn thảo
summernote

7

Đơn giản chỉ cần tạo một bộ lọc sẽ thực hiện các mẹo. (Đã trả lời cho góc 1.6)

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

Và sử dụng như sau trong html.

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

Điều này sửa lỗi với uglifying: "Nhà cung cấp không xác định: eProvider <- e <- unsafeFilter"
Valera Tumash

3

Nếu bạn muốn quay lại chỉ thị cũ, bạn có thể thêm nó vào ứng dụng của mình:

Chỉ thị:

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

Sử dụng

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

Nguồn - https://github.com/angular-ui/bootstrap/issues/813


Không cư xử giống nhau.
Casey

Làm thế nào để làm điều này cho trình soạn thảo summernote, ban đầu tôi sẽ lấy dữ liệu json (có chứa html) từ máy chủ, trong summernote tôi đang sử dụng ng-model. làm thế nào để làm cho mã được tin cậy để hiển thị trong trình soạn thảo
summernote

3

JavaScript

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

HTML

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

Làm thế nào để làm điều này cho trình soạn thảo summernote, ban đầu tôi sẽ lấy dữ liệu json (có chứa html) từ máy chủ, trong summernote tôi đang sử dụng ng-model. làm thế nào để làm cho mã được tin cậy để hiển thị trong trình soạn thảo
summernote

1

Đối với Rails (ít nhất là trong trường hợp của tôi) nếu bạn đang sử dụng đá quý angularjs-rails , hãy nhớ thêm mô-đun khử trùng

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

Và sau đó tải nó lên trong ứng dụng của bạn ...

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

Sau đó, bạn có thể làm như sau:

Trên mẫu:

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

Và cuối cùng:

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

Làm thế nào để làm điều này cho trình soạn thảo summernote, ban đầu tôi sẽ lấy dữ liệu json (có chứa html) từ máy chủ, trong summernote tôi đang sử dụng ng-model. làm thế nào để làm cho mã được tin cậy để hiển thị trong trình soạn thảo
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
Vui lòng không chỉ đăng mã dưới dạng câu trả lời mà còn bao gồm phần giải thích mã của bạn làm gì và cách giải quyết vấn đề của câu hỏi. Câu trả lời với một lời giải thích thường có chất lượng cao hơn, và có nhiều khả năng thu hút upvote.
Đánh dấu Rotteveel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.