আপনি কৌনিক 1.2+ এ এনজি-বাইন্ড-এইচটিএমএল-অনিরাপদ প্রতিলিপি করতে $ sce.trustAsHtml (স্ট্রিং) কীভাবে ব্যবহার করবেন?


226

ng-bind-html-unsafe কৌণিক 1.2 তে সরানো হয়েছিল

আমি এমন কিছু প্রয়োগ করার চেষ্টা করছি যেখানে আমার ব্যবহার করা দরকার ng-bind-html-unsafe। দস্তাবেজে এবং গিথুব প্রতিশ্রুতিবদ্ধ তারা বলে:

এনজি-বাইন্ড-এইচটিএমএল এনজি-এইচটিএমএল-বাইন্ড-অনিরাপদ আচরণের মতো করে (স্যানিটাইজেশন ছাড়াই অভ্যন্তরীণ এইচটিএমএল এর ফলাফল) যখন $ sce.trustAsHtml (স্ট্রিং) এর ফলাফলের সাথে আবদ্ধ থাকে।

তুমি এটা কিভাবে করো?


উত্তর:


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
কোনও ফাংশন দ্বারা ফেরত মূল্য দিয়ে আপনি এটি কীভাবে করতে পারেন? <পি এনজি-বাইন্ড-এইচটিএমএল = ""> {{বিবরণ (
বিভাগে.আইডি

2
আমি আপনাকে সঠিক পেয়েছি কিনা তা নিশ্চিত নন, তবে: <p ng-bind-html="trustedHtml"></p> এবং$scope.trustedHtml = $sce.trustAsHtml(description(category.id));
নেনাড

1
আমি আপনাকে প্রতিক্রিয়া জন্য ভালবাসা! স্পষ্টতই সমস্যাটি আমি 1.0.8 ব্যবহার করছি। গতিশীল সংখ্যক বিভাগ সহ আমার একটি ফর্ম রয়েছে তাই পরিবর্তনে আমি সঠিক বর্ণনাটি প্রদর্শন করতে চাই to <p ng-bind-html="description(category.id)"></p>তারপরে ফাংশনটির শেষ লাইন:return $sce.trustAsHtml(value);
49

2
তবে ... var x = sce.trustAsHtml ('foo'); var y = sce.trustAsHtml ('foo'); এক্স == Y; মিথ্যা ... সুতরাং আপনার ফাংশনটি কোনও নতুন অবজেক্ট ফেরত দেওয়ার কারণে এটি একটি অনন্ত ডাইজেস্ট লুপ তৈরি করা উচিত নয়?
rych

25
এছাড়াও উল্লেখ করার মতো বিষয়
হ'ল দৃশ্যের নিয়ামকটিতে স্থানান্তরিত হওয়া

633

ছাঁকনি

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

ব্যবহার

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

1
তোমার ngSanitizeএখানে কেন দরকার ?

2
@ অলিভার জোসফ্যাশ কারণ g দৃশ্য পরিষেবাটি এনজিএসাইটিজে সংজ্ঞায়িত করা হয়েছে। তারা বড় কার্যকারিতা বিচ্ছিন্ন করেছে যাতে আমরা কৌনিকটি কিছুটা ব্যবহার করতে পারি এবং সর্বদা পুরো কাঠামোটি ব্যবহার না করে।
ক্রিস স্যাটিঙ্গার

1
আমি ভাবছিলাম যে এরকম কোনও কিছুর সুরক্ষা সম্পর্কিত প্রভাবগুলি কী হতে পারে? আমি আলাদা প্রশ্নে আরও স্পষ্টতা চেয়েছি । সমস্ত ইনপুট প্রশংসা!
ফিলিপ বুলে

9
সংস্করণ ১.২-এ ফেলিক্স (যখন তারা এটি যুক্ত করেছেন) এটি মূল অংশ হিসাবে ডিফল্টরূপে সক্ষম করা হয়েছে ngSanitize, তাই নয় , তাই কোনও প্রয়োজন নেইngSanitize
TheSharpieOne

2
এটি কৌণিক দল দ্বারা তৈরি একটি ডিজাইনের সিদ্ধান্ত - এইভাবেই ফিল্টারগুলি কার্যকর করা উচিত - আপনি যদি অন্যথায় এটি করেন তবে সেগুলি কার্যকর হবে না। এটি কেন কোনও ফাংশন ফিরিয়ে আনতে হবে তার কারণ হ'ল কৌণিক 'সঠিক মুহূর্তটি খুঁজে না পাওয়া' না হওয়া পর্যন্ত প্রক্রিয়াজাতকরণে বিলম্ব করতে পারে। অন্যথায় যখন ফিল্টার বলা হয় তখন কাঠামোর কোনও প্রভাব পড়বে না। এটি ভাল এবং খারাপ উভয়ই, তবে যতদূর আমি বলতে পারি - অ্যাঙ্গুলারদের কৌশলপূর্ণ প্রক্রিয়াজাতকরণের সাথে লড়াই করা প্রয়োজন necessary এখানে আরও তথ্য: docs.angularjs.org/api/ng/provider/$filterProvider
ক্রিস

16

ব্যক্তিগতভাবে আমি আমার সমস্ত ডেটা ডাটাবেসে যাওয়ার আগে কিছু পিএইচপি লাইব্রেরি দিয়ে স্যানিটাইজ করি যাতে আমার জন্য আর কোনও এক্সএসএস ফিল্টারের প্রয়োজন হয় না।

অ্যাঙ্গুলারজেএস 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; হ্যালো ওয়ার্ল্ড! & Rdquo;); ডাটাবেসে তিনি <div data-ng-bind-html = "text"> </div> ব্যবহার করছেন এবং এটি পৃষ্ঠায় প্রদর্শিত হবে: System.out.println (& ldquo; হ্যালো ওয়ার্ল্ড! & Rdquo;) ;. আপনি কি বলছেন যে আপনার এনজিবিন্ডএইচটিএমএল ইউএনএসএফ নির্দেশিকাটি ব্যবহার করা এই সমস্যার সমাধান করবে?
অ্যালান 2

@ অ্যালান আমি বিশ্বাস করি এটি যদি কাজ করে তবে এটি <script>System.out.printIn("Hello World!");</script>ব্যক্তিগতভাবে চেষ্টা করে দেখেনি কারণ আমার পিএইচপি ব্যবহারকারীদের ইনপুট থেকে সমস্ত জেএসকে সরিয়ে দিয়েছে। আমি আমার দ্বিতীয় উদাহরণটি সরিয়ে দিয়েছি কারণ অ্যাংুলারের নেটিভ প্রতিটি ক্ষেত্রে উন্নত just কেবলমাত্র এটি ব্যবহার করুন।
মাইকেল জে। ক্যালকিনস

সামারনোট এডিটরের জন্য এটি কীভাবে করা যায়, প্রথমদিকে আমি সার্ভার থেকে জেসন ডেটা (যা এইচটিএমএল ধারণ করে) পেয়ে যাব, গ্রীষ্মকালীন নোটে আমি এনজি-মডেল ব্যবহার করছি। সামারনোট সম্পাদক থেকে কোডটি কীভাবে বিশ্বস্ত হিসাবে প্রদর্শন করা যায়
কোডার্নার

8

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

1. ফিল্টার ব্যবহার করুন

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

(এইচটিএমএল) ব্যবহার করে:

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

2. এনজিএসনিটিজ: নিরাপদ ব্যবহার করুন

অন্তর্ভুক্ত করা angular-sanitize.js

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

ngSanitizeরুট কৌণিক অ্যাপ্লিকেশন যোগ করুন

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

(এইচটিএমএল) ব্যবহার করে:

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

সামারনোট এডিটরের জন্য এটি কীভাবে করা যায়, প্রথমদিকে আমি সার্ভার থেকে জেসন ডেটা (যা এইচটিএমএল ধারণ করে) পেয়ে যাব, গ্রীষ্মকালীন নোটে আমি এনজি-মডেল ব্যবহার করছি। সামারনোট সম্পাদক থেকে কোডটি কীভাবে বিশ্বস্ত হিসাবে প্রদর্শন করা যায়
কোডার্নার

7

কেবল একটি ফিল্টার তৈরি করা কৌশলটি করবে। (কৌনিক 1.6 এর জবাব দেওয়া)

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

এবং এইচটিএমএল অনুসরণ হিসাবে এটি ব্যবহার করুন।

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

এটি একটি অগ্লিফাইটিংয়ের সাথে ত্রুটিটি সমাধান করে: "অজানা সরবরাহকারী: ইপ্রোভাইডার <- ই <- অনিরাপদ ফিল্টার"
ভ্যালেরা তুমাস

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


একই আচরণ করে না।
কেসি

সামারনোট এডিটরের জন্য এটি কীভাবে করা যায়, প্রথমদিকে আমি সার্ভার থেকে জেসন ডেটা (যা এইচটিএমএল ধারণ করে) পেয়ে যাব, গ্রীষ্মকালীন নোটে আমি এনজি-মডেল ব্যবহার করছি। গ্রীষ্মকালীন সম্পাদনায় কোডটি কীভাবে বিশ্বস্ত হিসাবে প্রদর্শন করা যায়
কোডার্নার

3

জাভাস্ক্রিপ্ট

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

এইচটিএমএল

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

সামারনোট এডিটরের জন্য এটি কীভাবে করা যায়, প্রথমদিকে আমি সার্ভার থেকে জেসন ডেটা (যা এইচটিএমএল ধারণ করে) পেয়ে যাব, গ্রীষ্মকালীন নোটে আমি এনজি-মডেল ব্যবহার করছি। সামারনোট সম্পাদক থেকে কোডটি কীভাবে বিশ্বস্ত হিসাবে প্রদর্শন করা যায়
কোডার্নার

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

সামারনোট এডিটরের জন্য এটি কীভাবে করা যায়, প্রথমদিকে আমি সার্ভার থেকে জেসন ডেটা (যা এইচটিএমএল ধারণ করে) পেয়ে যাব, গ্রীষ্মকালীন নোটে আমি এনজি-মডেল ব্যবহার করছি। গ্রীষ্মকালীন সম্পাদনায় কোডটি কীভাবে বিশ্বস্ত হিসাবে প্রদর্শন করা যায়
কোডার্নার


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
দয়া করে একটি উত্তর হিসাবে কেবল কোড পোস্ট করবেন না, তবে আপনার কোডটি কী করে এবং কীভাবে এটি সমস্যার সমস্যার সমাধান করে তার একটি ব্যাখ্যাও অন্তর্ভুক্ত করুন। একটি ব্যাখ্যা সহ উত্তরগুলি সাধারণত উচ্চমানের হয় এবং এগুলি আরও বেশি আকর্ষণ করতে পারে are
মার্ক রোটেভেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.