将HTML插入视图

Swa*_*aff 788 javascript escaping html-sanitizing angularjs

是否可以在AngularJS控制器中创建HTML片段并在视图中显示此HTML?

这需要将不一致的JSON blob转换为嵌套的id : value对列表.因此,HTML是在控制器中创建的,我现在希望显示它.

我创建了一个模型属性,但是如果不打印HTML,则无法在视图中呈现它.


更新

似乎问题来自角度渲染创建的HTML作为引号内的字符串.将试图找到解决这个问题的方法.

示例控制器:

var SomeController = function () {

    this.customHtml = '<ul><li>render me please</li></ul>';
}
Run Code Online (Sandbox Code Playgroud)

示例视图:

<div ng:bind="customHtml"></div>
Run Code Online (Sandbox Code Playgroud)

给:

<div>
    "<ul><li>render me please</li></ul>"
</div>
Run Code Online (Sandbox Code Playgroud)

小智 1109

对于Angular 1.x,请ng-bind-html在HTML中使用:

<div ng-bind-html="thisCanBeusedInsideNgBindHtml"></div>
Run Code Online (Sandbox Code Playgroud)

此时您将收到attempting to use an unsafe value in a safe context错误,因此您需要使用ngSanitize$ sce来解决此问题.

$ SCE

使用$sce.trustAsHtml()控制器的HTML字符串转换.

 $scope.thisCanBeusedInsideNgBindHtml = $sce.trustAsHtml(someHtmlVar);
Run Code Online (Sandbox Code Playgroud)

ngSanitize

有两个步骤:

  1. 包括angular-sanitize.min.js资源,即:
    <script src="lib/angular/angular-sanitize.min.js"></script>

  2. 在js文件(控制器或通常是app.js)中,包含ngSanitize,即:
    angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives', 'ngSanitize'])

  • 不使用ngSanitize,现在可以使用`$ sce`来完成.将它注入控制器并通过它传递html.`$ scope.thisCanBeusedInsideNgBindHtml = $ sce.trustAsHtml(someHtmlVar);`否则我不断尝试在安全的上下文中使用不安全的值 (59认同)
  • 在Angular 1.2中,删除了"ng-bind-html-unsafe"并将两个指令组合在一起.请参阅:https://github.com/angular/angular.js/blob/master/CHANGELOG.md#120-rc1-spooky-giraffe-2013-08-13 (28认同)
  • http://stackoverflow.com/questions/21829275/angular-js-shows-html-within-the-tag < - 为我工作:)这里的答案中没有一个选项工作不幸 (9认同)
  • 只是让人们感到沮丧,这个答案的最新更新,加上答案底部的ngSanitize要求确实有效. (7认同)
  • 我们需要在这里进行一些清理,这对我来说似乎没什么用. (3认同)
  • 真的吗?我们需要另一个lib来工作吗? (3认同)
  • 1)ng-bind-html然后2)sce.trustAsHtml()....有没有办法一步完成? (2认同)

小智 311

你也可以像这样创建一个过滤器:

var app = angular.module("demoApp", ['ngResource']);

app.filter("trust", ['$sce', function($sce) {
  return function(htmlCode){
    return $sce.trustAsHtml(htmlCode);
  }
}]);
Run Code Online (Sandbox Code Playgroud)

然后在视图中

<div ng-bind-html="trusted_html_variable | trust"></div>
Run Code Online (Sandbox Code Playgroud)

注意:此过滤器信任传递给它的任何和所有html,并且如果将带有用户输入的变量传递给它,则可能会出现XSS漏洞.

  • 只有在完全信任HTML时才使用它.这不会以任何方式清理HTML,但只允许Angular将其注入页面.恶意HTML可能会引发XSS攻击. (28认同)
  • 为什么过滤器叫做"sanitize"?这是如此误导,因为它实际上没有消毒任何东西.相反,它应该被称为`trust`,`trustSafe`或类似的东西. (14认同)

anp*_*tel 118

Angular JS在标记内显示HTML

上面链接中提供的解决方案对我有用,这个线程没有任何选项.对于任何使用AngularJS版本1.2.9寻找相同内容的人

这是一份副本:

好的,我找到了解决方案:

JS:

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

HTML:

<p ng-bind-html="renderHtml(value.button)"></p>
Run Code Online (Sandbox Code Playgroud)

编辑:

这是设置:

JS档案:

angular.module('MyModule').controller('MyController', ['$scope', '$http', '$sce',
    function ($scope, $http, $sce) {
        $scope.renderHtml = function (htmlCode) {
            return $sce.trustAsHtml(htmlCode);
        };

        $scope.body = '<div style="width:200px; height:200px; border:1px solid blue;"></div>'; 

    }]);
Run Code Online (Sandbox Code Playgroud)

HTML文件:

<div ng-controller="MyController">
    <div ng-bind-html="renderHtml(body)"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您需要绝对确保html可以信任.否则门是敞开的XSS攻击. (7认同)

Pie*_*eau 63

幸运的是,您不需要任何花哨的过滤器或不安全的方法来避免该错误消息.这是以预期和安全的方式在视图中正确输出HTML标记的完整实现.

必须在Angular之后包含sanitize模块:

<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular-sanitize.js"></script>
Run Code Online (Sandbox Code Playgroud)

然后,必须加载模块:

angular.module('app', [
  'ngSanitize'
]);
Run Code Online (Sandbox Code Playgroud)

这将允许您在控制器,指令等的字符串中包含标记:

scope.message = "<strong>42</strong> is the <em>answer</em>.";
Run Code Online (Sandbox Code Playgroud)

最后,在模板中,它必须像这样输出:

<p ng-bind-html="message"></p>
Run Code Online (Sandbox Code Playgroud)

这将产生预期的输出:42答案.


小智 61

我今天试过,我找到的唯一方法就是这个

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

  • 为了将来参考,1.2版本中删除了ng-bind-html-unsafe.现在你需要ngSanitize模块并绑定不安全的html,你应该使用$ sce.trustAsHtml方法. (11认同)
  • 仅当源是可信的以避免跨站点脚本攻击时,才应使用此解决方案. (6认同)
  • 从Angular 1.0.2开始,这对我有用,不需要其他文件或连接. (3认同)

Bid*_*rai 52

ng-bind-html-unsafe 不再有效.

这是最短的方式:

创建一个过滤器:

myApp.filter('unsafe', function($sce) { return $sce.trustAsHtml; });
Run Code Online (Sandbox Code Playgroud)

在你看来:

<div ng-bind-html="customHtml | unsafe"></div>
Run Code Online (Sandbox Code Playgroud)

PS此方法不要求您包含该ngSanitize模块.

  • 这是我在Angular 1.2中看到的最佳解决方案.在接受的答案中使用`$ sce`的解决方案对我来说并不起作用,我不想为这么简单的事情添加额外的依赖. (2认同)

小智 25

在HTML上

<div ng-controller="myAppController as myCtrl">

<div ng-bind-html-unsafe="myCtrl.comment.msg"></div>
Run Code Online (Sandbox Code Playgroud)

要么

<div ng-bind-html="myCtrl.comment.msg"></div
Run Code Online (Sandbox Code Playgroud)

在控制器上

mySceApp.controller("myAppController", function myAppController( $sce) {

this.myCtrl.comment.msg = $sce.trustAsHtml(html);
Run Code Online (Sandbox Code Playgroud)

也适用于 $scope.comment.msg = $sce.trustAsHtml(html);

  • 如果有人想破解自己的浏览器,他们可以,谁在乎.它不会影响其他用户.@BradGreens这是个问题吗? (4认同)

Mat*_*att 9

我发现使用ng-sanitize不允许我在html中添加ng-click.

为了解决这个问题我添加了一个指令 像这样:

app.directive('htmldiv', function($compile, $parse) {
return {
  restrict: 'E',
  link: function(scope, element, attr) {
    scope.$watch(attr.content, function() {
      element.html($parse(attr.content)(scope));
      $compile(element.contents())(scope);
    }, true);
  }
}
});
Run Code Online (Sandbox Code Playgroud)

这是HTML:

<htmldiv content="theContent"></htmldiv>
Run Code Online (Sandbox Code Playgroud)

祝好运.


Hen*_*Neo 6

刚刚通过遵循angular(v1.4)文档使用ngBindHtml做到了这一点,

<div ng-bind-html="expression"></div> 
and expression can be "<ul><li>render me please</li></ul>"
Run Code Online (Sandbox Code Playgroud)

确保在模块的依赖项中包含ngSanitize.那它应该工作正常.