作用

DomSanitizer有助于防止跨站点脚本安全漏洞(XSS),通过清除值以便在不同的DOM上下文中安全使用。

为什么会需要使用DomSanitizer

Angular4中默认将所有输入值视为不受信任。当我们通过 property,attribute,样式,类绑定或插值等方式,将一个值从模板中插入到DOM中时,Angular4会自帮我们清除和转义不受信任的值。
如下有个例子:
domsan-test.component.ts

import { Component } from '@angular/core';@Component({selector: 'app-domsan-test',templateUrl: './domsan-test.component.html'
})
export class DomsanTestComponent {html='<h1>哈哈哈哈哈哈<h1><script>attackerCode()</script>';
}

domsan-test.component.html

<div>{{html}}</div>

结果:Angular4 在编译的时候,会自动清理 HTML 输入并转义不安全的代码,因此在这种情况下,这个html代码片段被当成了字符串,只能在屏幕上显示为文本。

这时候如果需要将html代码片段渲染出来,就需要用到DomSanitizer了。

方法

abstract class DomSanitizer implements Sanitizer {abstract sanitize(context: SecurityContext, value: SafeValue | string | null): string | null
abstract bypassSecurityTrustHtml(value: string): SafeHtml
abstract bypassSecurityTrustStyle(value: string): SafeStyle
abstract bypassSecurityTrustScript(value: string): SafeScript
abstract bypassSecurityTrustUrl(value: string): SafeUrl
abstract bypassSecurityTrustResourceUrl(value: string): SafeResourceUrl

下面将使用例子来了解如何使用这几个方法。

1. bypassSecurityTrustHtml

domsan-test.component.ts

import { Component, OnInit} from '@angular/core';
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';@Component({selector: 'app-domsan-test',templateUrl: './domsan-test.component.html'
})
export class DomsanTestComponent implements OnInit {html='<h1>哈哈哈哈哈哈<h1><script>attackerCode()</script>';shtml: SafeHtml;constructor(private sanitizer: DomSanitizer) { }ngOnInit() {this.shtml =this.sanitizer.bypassSecurityTrustHtml(this.html);}
}

domsan-test.component.html

<div [innerHTML]="shtml"></div>

结果:

注:插入方式不可以是插值法直接插入,必须是属性绑定的形式插入。
如果以下面的方式插入,是错误的方式。

<div>{{shtml}}</div>

结果:

bypassSecurityTrustStyle,bypassSecurityTrustScript,bypassSecurityTrustUrl,bypassSecurityTrustResourceUrl的使用方式与bypassSecurityTrustHtml类似。
属性绑定的形式分别是:

<!-- bypassSecurityTrustStyle -->
<div [style]="sstyle"></div>  
<!-- bypassSecurityTrustUrl -->
<div > <img [src]="aa"></div>  
<!-- bypassSecurityTrustResourceUrl -->
<iframe [src]="surl"></iframe>  

2. sanitize

有时后我们需要手动过滤输入值,这时可以使用 sanitize 方法

this.html = this.sanitizer.sanitize(SecurityContext.HTML,this.html);
console.log(this.html);

控制台输出:

WARNING:sanitizing HTML stripped some content (see http://g.co/ng/security#xss).
domsan-test.component.ts:24 <h1>&#21704;&#21704;&#21704;&#21704;&#21704;&#21704;</h1><h1>attackerCode()</h1>

3.自定义指令

为了更方面的在项目中使用,可自定义一个pipe。
keepHtml.pipe.ts

import { Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';@Pipe({ name: 'keepHtml', pure: false })
export class EscapeHtmlPipe implements PipeTransform {constructor(private sanitizer: DomSanitizer) {}transform(content) {return this.sanitizer.bypassSecurityTrustHtml(content);}
}

html

<div [innerHTML]="html | keepHtml"></div>

使用pipe要在所在的module.ts中声明这个指令并导入

import {EscapeHtmlPipe} from './domsan-test/keepHtml.pipe';
@NgModule({declarations: [EscapeHtmlPipe],imports: []
})
export class DemoModule { }

当使用bypassSecurityTrust …时,确保尽可能早地调用方法并尽可能接近值的来源,以便于验证它的使用是否会产生安全错误。
等有空再详细补充吧。。
参考链接:
https://angular.cn/api/platform-browser/DomSanitizer
https://blog.csdn.net/qq_34645412/article/details/79002099
https://segmentfault.com/a/1190000008809095

Angular4中使用DomSanitizer相关推荐

  1. angular4 php,Angular4中常用管道实例详解

    通常我们需要使用管道实现对数据的格式化,Angular4中的管道和之前有了一些变化.本文主要介绍Angular4中常用管道,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧, ...

  2. Angular4中常用管道

    原文链接:http://blog.csdn.net/haijing1995/article/details/71404350 ------------------------------------- ...

  3. php 引入echarts路径,angular4中引入echarts的方法(代码示例)

    本篇文章给大家带来的内容是关于angular4中引入echarts的方法(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.安装ngx-echarts npm insta ...

  4. angular4 php,Angular4中router使用技巧

    这次给大家带来Angular4中router使用技巧,Angular4中router使用的注意事项有哪些,下面就是实战案例,一起来看一下. router,也就是路由,是前端中一个比较重要的概念.通过r ...

  5. 在Angular4中使用ng2-baidu-map详解

    一.引言 之前在Angular4使用过百度地图,记录一下踩过的坑 二.实现 1.安装 npm install angular2-baidu-map 2.在app.module.ts配置 ak key在 ...

  6. Angular4中调用js代码

    转自 引言:Angular2开始采用TypeScript进行编码.本文讲述如何在Angular4项目中调用原生的 js 代码. 本文代码 代码使用环境:webstrom 调用过程可以归纳为: 引入 j ...

  7. angular4更改表单中显示的值_关于angular4中FormBuilder重新赋值时发生的问题

    代码如图 constructor(public fb: FormBuilder) { this.formModel = this.fb.group({ leader_id: [''] }); this ...

  8. Angular4中使用PrimeNG calendar

    这段时间在我的Angular项目中需要用到日历这一控件: 像treeview.calendar等等这些"大"型控件,如果要自己写的话,需要花费很多时间,而且容易遗漏掉一些细节问题. ...

  9. templateref html内容,angular4中的ElemenetRef和TemplateRef之间的区别

    我见过很多ElemenetRef和TemplateRef的例子让我更加困惑. > ElementRef和TemplateRef之间的区别是什么我们应该使用另一个 this is my eleme ...

最新文章

  1. 将Java程序打jar包并运行
  2. ​知乎700万人围观:如何快速成为数据分析师?
  3. Flink SQL 的 9 个示例
  4. windows下python安装
  5. 646. Maximum Length of Pair Chain 最长的链条长度
  6. 一个简单的轮播图代码
  7. 安装TortoiseSVN报could not write value to key的错误解决方案
  8. 【苹果群发iMessage推送位置推】软件安装将会按照 Developer Program License Agreement
  9. 为了不被晒黑,这届年轻人有多拼?| 小红书防晒趋势洞察
  10. 精打教程(144)拼多多一联电子面单修改模板
  11. Android studio制作计算器源代码
  12. android 实例 super 什么意思
  13. 【Neo4j】第 11 章 :在您的 Web 应用程序中使用 Neo4j
  14. c语言编程单向,C语言单向链表的表示与实现实例详解
  15. 金蝶财务软件服务器文件是什么,金蝶财务软件 远程服务器
  16. 圣母大学计算机学院刘芳副教授,IEEE Fellow Danny Ziyi Chen教授来计算机科学技术学院交流...
  17. 企业内部沟通,即时通讯软件要怎么选?
  18. 数据库存储过程语法总结
  19. 0基础快速入门CSS技术栈(4)—图解详细阐述CSS的复合选择器、标签显示模式、行高、CSS背景,及最为重要的CSS三大特性附带权重计算笔试题(附详细案例源码解析过程)
  20. 怎样写英文借据和收据

热门文章

  1. led数码显示控制plc实验_实验三 LED数码显示控制 PLC实验报告
  2. Rails 地图插件
  3. Pydicom User Giude
  4. 有害气体监测物联网云平台方案
  5. 虚拟办公室,产业创新与转型升级
  6. 微型计算机的输入设备教案,高中信息技术教案设计:微型计算机的输入 输入设备1.doc...
  7. html 电视直播软件,智能电视装什么软件可以看电视直播,一个软件
  8. [渝粤教育] 中国地质大学 机械原理 复习题
  9. js runtime
  10. 使用yocto为raspberry编译内核