删除ng-bind-html-unsafe后,如何注入HTML?

met*_*ate 265 html angularjs

我正在尝试使用$sanitizeprovider和ng-bind-htm-unsafe指令允许我的控制器将HTML注入DIV.

但是,我无法让它发挥作用.

<div ng-bind-html-unsafe="{{preview_data.preview.embed.html}}"></div>
Run Code Online (Sandbox Code Playgroud)

我发现它是因为它从AngularJS中删除了(谢谢).

但没有ng-bind-html-unsafe,我得到这个错误:

http://errors.angularjs.org/undefined/$sce/unsafe

Lee*_*run 348

如Alex所建议的那样,您可以将其转换为简单的过滤器,而不是在示波器中声明一个函数:

angular.module('myApp')
    .filter('to_trusted', ['$sce', function($sce){
        return function(text) {
            return $sce.trustAsHtml(text);
        };
    }]);
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它:

<div ng-bind-html="preview_data.preview.embed.html | to_trusted"></div>
Run Code Online (Sandbox Code Playgroud)

这是一个有效的例子:http://jsfiddle.net/leeroy/6j4Lg/1/

  • 我在[github](https://github.com/capaj/ng-tools)上有一小部分有用的角度工具,如果你不介意的话,我会在这些工具中包含这个过滤器.当你信任html时,这是恕我直言的最佳解决方案. (3认同)
  • angular.module('myApp').filter('trustAsHtml',['$ sce',function($ sce){return $ sce.trustAsHtml}]); (2认同)

ijp*_*est 275

您表示您正在使用Angular 1.2.0 ...作为其他指示之一,ng-bind-html-unsafe已被弃用.

相反,你会想做这样的事情:

<div ng-bind-html="preview_data.preview.embed.htmlSafe"></div>
Run Code Online (Sandbox Code Playgroud)

在您的控制器中,注入$sce服务,并将HTML标记为"受信任":

myApp.controller('myCtrl', ['$scope', '$sce', function($scope, $sce) {
  // ...
  $scope.preview_data.preview.embed.htmlSafe = 
     $sce.trustAsHtml(preview_data.preview.embed.html);
}
Run Code Online (Sandbox Code Playgroud)

请注意,您将要使用1.2.0-rc3或更高版本.(他们修复 rc3中的一个错误,该错误阻止了"观察者"在受信任的HTML上正常工作.)

  • 请注意,这可能会导致代码中出现XSS安全问题.请参阅下面的答案提示`ngSanitize`(http://stackoverflow.com/a/25679834/22227),以获得更安全的替代方案. (5认同)
  • 您可以查看有关$ sce [here](https://docs.angularjs.org/api/ng/service/$sce)的更多信息,只是为了追求好奇心!;) (4认同)
  • 我尝试使用上面但它打破了我的代码.似乎你需要在函数定义之前添加'$ scope' - 也许它一次被"理解",但不再是.以下应该有效:`myApp.controller('myCtrl',['$ scope','$ sce',function($ scope,$ sce){` (2认同)

p.m*_*los 121

  1. 您需要确保加载了sanitize.js. 例如,从https://ajax.googleapis.com/ajax/libs/angularjs/[LAST_VERSION]/angular-sanitize.min.js加载它
  2. 你需要ngSanitize在你的上面包含模块app :var app = angular.module('myApp', ['ngSanitize']);
  3. 你只需要与ng-bind-html原始html内容绑定.无需在控制器中执行任何其他操作.解析和转换由ngBindHtml指令自动完成.(阅读How does it work有关此内容的部分:$ sce).所以,在你的情况下<div ng-bind-html="preview_data.preview.embed.html"></div>会做的工作.

  • 安全地做到这一点是最干净的选择.它带来了更多的依赖,但它是关于安全所以毫不犹豫! (3认同)
  • 这不适用于某些标签,如输入.当然,没有简单的方法来解决这个问题.真的很沮丧. (3认同)

小智 111

对我来说,最简单,最灵活的解决方案是:

<div ng-bind-html="to_trusted(preview_data.preview.embed.html)"></div>
Run Code Online (Sandbox Code Playgroud)

并为您的控制器添加功能:

$scope.to_trusted = function(html_code) {
    return $sce.trustAsHtml(html_code);
}
Run Code Online (Sandbox Code Playgroud)

不要忘记添加$sce到控制器的初始化.


小智 65

在我看来,最好的解决方案是:

  1. 创建一个自定义过滤器,例如,可以在common.module.js文件中使用 - 在整个应用程序中使用:

    var app = angular.module('common.module', []);
    
    // html filter (render text as html)
    app.filter('html', ['$sce', function ($sce) { 
        return function (text) {
            return $sce.trustAsHtml(text);
        };    
    }])
    
    Run Code Online (Sandbox Code Playgroud)
  2. 用法:

    <span ng-bind-html="yourDataValue | html"></span>
    
    Run Code Online (Sandbox Code Playgroud)

现在 - 我不明白为什么指令ng-bind-htmltrustAsHtml作为其功能的一部分 - 对我来说似乎有些愚蠢,它没有

无论如何 - 这就是我这样做的方式 - 67%的时间,它始终有效.

  • 每个涉及将 HTML 视为可信的解决方案都会引入 XSS 漏洞。请参阅下面建议 ngSanitize 的答案 (stackoverflow.com/a/25679834/22227) 以获得更安全的修复。 (2认同)

Jas*_*aat 7

您可以创建自己的简单不安全html绑定,当然如果您使用用户输入,则可能存在安全风险.

App.directive('simpleHtml', function() {
  return function(scope, element, attr) {
    scope.$watch(attr.simpleHtml, function (value) {
      element.html(scope.$eval(attr.simpleHtml));
    })
  };
})
Run Code Online (Sandbox Code Playgroud)


ksi*_*ons 5

您不需要在ng-bind-html-unsafe中使用{{}}:

<div ng-bind-html-unsafe="preview_data.preview.embed.html"></div>
Run Code Online (Sandbox Code Playgroud)

这是一个例子:http://plnkr.co/edit/R7JmGIo4xcJoBc1v4iki?p = preview

{{}}运算符实际上只是ng-bind的简写,因此您尝试的内容相当于绑定中的绑定,这不起作用.

  • 我正在使用1.2.:( Grrr!如何注入不安全的HTML?没有它我得到这个错误:http://errors.angularjs.org/undefined/$sce/unsafe (2认同)