angular ng-bind-html $sce.trustAsHtml

使用ng-bind-html和$sce.trustAsHtml显示有html符号的内容

angularJS在进行数据绑定时默认是会以文本的形式输出,也就是对你数据中的html标签不进行转义照单全收,这样提高了安全性,防止了html标签中的注入攻击,但有些时候还是需要的,特别是从数据库读取带格式的文本时,无法正常的显示在页面中。

而要对html进行转义,则要在数据绑定的html标签中使用ng-bind-html属性,该属性依赖与$sanitize,也就是需要引入angular-sanitize.js文件,并在module定义时注入该服务ngSanitize。比如:

html:

<span ng-controller="myCtr" ng-bind-html = "htmlStr"></span>
javascript:
function myCtr($scope){
  $scope.htmlStr = ‘<p style="color:red;font-size=18px;"></p>‘;
};

如此则可以实现html转义,但有个问题就是style这种标签会被angularJS认为是不安全的所以统统自动过滤掉,而为了保留这些就需要开启非安全模式。可以通过angular自带的$sce服务解决。$sce是angularJS自带的安全处理模块,$sce.trustAsHtml(input)方法便是将数据内容以html的形式进行解析并返回。例如:

<div ng-repeat="article in articles">
  <div class="panel-heading">
  <h4><b>{{article.title}}</b></h4>
  </div>
  <div class="panel-body">
  <article id="word-display" ng-bind-html="article.content | trustHtml">
  </article>
  </div>
  </div>

javascript:

success(function (data) {
  $scope.articles = data;
});
myApp.filter(‘trustHtml‘, function ($sce) {
  return function (input) {
  return $sce.trustAsHtml(input);
  }
  });

还可以使用$sanitize服务,$sanitize会根绝一个白名单来净化html标签。这样,不安全的内容就不会被返回. 白名单是根据$compileProvider的aHrefSanitizationWhitelist和imgSrcSanitizationWhitelist函数得到的.

贴一段代码:

<!DOCTYPE html>
<html ng-app="myApp">
<head>
  <title></title>
  <meta charset="utf-8">
  <script src="../angular-1.3.2.js"></script>
  <script src="angular-sanitize.min.js"></script>
  <script src="script.js"></script>
  <link type="text/css" href="../bootstrap.css" rel="stylesheet" />
</head>
<body>
<div class="container">
  <table class="table table-bordered" ng-controller="ctrl">
  <caption>通过ngSanitize模块的$sanitize服务解析html</caption>
  <thead>
  <tr>
  <th>使用的指令</th>
  <th>格式化方法</th>
  <th>指令的写法</th>
  <th>解析结果</th>
  </tr>
  </thead>
  <tbody>
  <tr>
  <td>ng-bind-html</td>
  <td>使用内置的$sanitize <br/>(不需要出现在js里,只要模型添加了ngSanitize模块, <br/>然后使用ng-bind-html,它的值就自动通过$sanitize编译)</td>
  <td><pre>&lt;div ng-bind-html="myHtml"&gt;<br>&lt;/div&gt;</pre></td>
  <td><div ng-bind-html="myHtml"></div></td>
  </tr>
  <tr>
  <td>ng-bind-html</td>
  <td>使用$sce的trustAsHtml方法编译<br/>(以后会细讲$sce服务,这里不是重点)</td>
  <td><pre>&lt;div ng-bind-html="trustHtml"&gt;<br>&lt;/div&gt;</pre></td>
  <td><div ng-bind-html="trustHtml"></div></td>
  </tr>
  <tr>
  <td>ng-bind</td>
  <td>不编译</td>
  <td><pre>&lt;div ng-bind="myHtml"&gt;<br>&lt;/div&gt;</pre></td>
  <td><div ng-bind="myHtml"></div></td>
  </tr>
  </tbody>
  </table>
  <a class="btn btn-default" href="http://plnkr.co/edit/3FBasliZTRjKs3jwTpoR?p=preview" role="button">plunker</a>
</div>
</body>
</html>

JS部分:

var app =angular.module(‘myApp‘,[‘ngSanitize‘]);
app.controller(‘ctrl‘,function($scope,$sce){
  $scope.myHtml = ‘<p style="color:blue">an html\n‘ +
  ‘<em onclick="this.textContent=\‘code_bunny\‘">click here</em>\n‘ +
  ‘snippet</p>‘;
  $scope.trustHtml = $sce.trustAsHtml($scope.myHtml)
});

对比一下这三种情况的结果:

具体的结果可以看: http://plnkr.co/edit/3FBasliZTRjKs3jwTpoR?p=preview

ng-bind-html如果使用内置的 $sanitize服务,那么$sanitize会自动对myHtml进行净化.$sanitize会把标签的属性都移除,以及绑定在元素上的事件.仅保留了标签和内容.

ng-bind-html如果 通过$sce.trustAsHtml()处理以后的返回值,它不再经过$sanitize服务的净化.直接作为元素的.html()绑定给元素,保留所有的属性和事件,这一行的内容不依赖于ngSanitize模块,$sce服务是内置的.

当使用ng-bind指令时,绑定的值就作为字符串填充到元素里

使用ng-bind-html容易引起XSS(脚本注入攻击),这一点会在后面介绍。

时间: 2024-11-06 03:34:35

angular ng-bind-html $sce.trustAsHtml的相关文章

angular ng build 报错 Cannot read property &#39;default&#39; of undefined

95% emitting index-html-webpack-plugin Cannot read property 'default' of undefinedTypeError: Cannot read property 'default' of undefined at compiler.hooks.emit.tapPromise (E:\projects\node_modules\@angular-devkit\build-angular\src\angular-cli-files\p

angular ng指令

1.指令 ng-app,ng- 都是angular的指令系统ng-app: ng-app是angular的初始化,一个页面只能有一个ng-app,位置不限制.在页面上加入了这个执行,那么从当前的元素以及儿子元素,都交给angular管理,不赋值的话,会有一个默认模块.ng-app="myApp"这里如果加了自定义的名字,那么必须创建对应的模块.ng-model:双向绑定数据 ng-init:给字段赋予初始值.ng-init="val=0". ng-bind:单向绑定

野兽的Angular Api 学习、翻译及理解 - - $sce 和 $sceDelegate

野兽的ng api学习 -- $sce 和 $sceDelegate $sce $sce 服务是AngularJs提供的一种严格上下文逸出服务. 严格上下文逸出服务(翻译水平有限,较渣...) 严格上下文逸出(SCE)是一种需要在一定的语境中导致AngularJS绑定值被标记为安全使用语境的模式.由用户通过ng-bind-html绑定任意HTML语句就是这方面的一个例子.我们称这些上下文语境为特权或者SCE. 下面代码是简化了的ngBindHtml实现(当然,这不是完整版ngBindHtml源码

angular中的ng-bind-html指令和$sce服务

angular js的强大之处之一就是他的数据双向绑定这一牛B功能,我们会常常用到的两个东西就是ng-bind和针对form的ng-model.但在我们的项目当中会遇到这样的情况,后台返回的数据中带有各种各样的html标签.如: $scope.currentWork.description = “hello,<br><b>今天我们去哪里?</b>” 我们用ng-bind-html这样的指令来绑定,结果却不是我们想要的.是这样的 hello, 今天我们去哪里? 怎么办呢?

Angular - - $sce 和 $sceDelegate

$sce $sce 服务是AngularJs提供的一种严格上下文转义服务. 严格的上下文转义服务 严格的上下文转义(SCE)是一种需要在一定的语境中导致AngularJS绑定值被标记为安全使用语境的模式.由用户通过ng-bind-html绑定任意HTML语句就是这方面的一个例子.我们称这些上下文转义为特权或者SCE. 下面代码是简化了的ngBindHtml实现(当然,这不是完整版ngBindHtml源码): var ngBindHtmlDirective = ['$sce', function(

angular用$sce服务来过滤HTML标签

angular js的强大之处之一就是他的数据双向绑定这一牛B功能,我们会常常用到的两个东西就是ng-bind和针对form的ng-model.但在我们的项目当中会遇到这样的情况,后台返回的数据中带有各种各样的html标签.对于angular 1.2一下的版本我们必须要使用$sce这个服务来解决我们的问题.它可以通过使用$sce.trustAsHtml().该方法将值转换为特权所接受并能安全地使用"ng-bind-html". 1 .controller('HealthEducatio

野兽的Angular Api 学习、翻译及理解 - - $templateCache 和 $templateRequest

野兽的ng api学习 -- $templateCache 和 $templateRequest $templateCache 第一次使用模板,它被加载到模板缓存中,以便快速检索.你可以直接将模板标签加载到缓存中,或者通过$templateCache服务. 通过script标签: <script type=”text/ng-template” id=”template.html”> <p>This is the content of the template</p> &

[AngularJS] Html ngSanitize, $sce

Safely render arbitrary HTML snippets by using ngSanitize and $sce. By default angularJS consider user's input html is danger, so if you want to display html tag on the page will show unsafe error. To remove this error and trust user's input, we can

简话Angular 03 Angular内置表达式大全

一句话: 大多数html标签属性和事件都有一个对应的ng指令 说明:这些指令和原生html最大的区别就是可以动态更新.比如一个div的样式用ng-class后,我们就可以随意应用css class. 1. 内置指令大全 ng-include 包含一个文件 ng-href ng-src 对应 href src ng-disabled ng-readonly 对应 disabled readonly ng-checked ng-selected ng-options ng-true-value ng