the*_*tic 25 sanitize typescript angular
我试图从我的数据库中获取第三方(可能不安全)的html内容并将其插入到我的html文档中.
我如何安全地做到这一点(针对XSS的保护)?
在Angular1.x中曾经有过$sce
消毒输入,我如何在Angular2中做到这一点?据我了解,Angular2默认自动清理它,这是正确的吗?
这样的东西不起作用:
<div class="foo">
{{someBoundValueWithSafeHTML}} // I want HTML from db here
</div>
Run Code Online (Sandbox Code Playgroud)
Pie*_*Duc 43
要将普通HTML插入angular2应用程序,您可以使用该[innerHtml]
指令.
<div [innerHtml]="htmlProperty"></div>
Run Code Online (Sandbox Code Playgroud)
这不适用于具有自己的组件和指令的HTML,至少不会像您期望的那样.
但是,如果您确实收到了不安全的html警告,那么HTML
在注入之前您应该信任第一个警告.你必须使用DomSanitizer
这样的东西.例如,<h3>
元素被认为是安全的.一个<input>
元素是没有的.
export class AppComponent {
private _htmlProperty: string = '<input type="text" name="name">';
public get htmlProperty() : SafeHtml {
return this.sr.bypassSecurityTrustHtml(this._htmlProperty);
}
constructor(private sr: DomSanitizer){}
}
Run Code Online (Sandbox Code Playgroud)
并让您的模板与此保持一致:
<div [innerHtml]="htmlProperty"></div>
Run Code Online (Sandbox Code Playgroud)
虽然有点单挑:
警告:使用不受信任的用户数据调用此方法会使应用程序面临XSS安全风险!
如果您打算更多地使用此技术,您可以尝试编写一个@Pipe
来完成此任务.
import { Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
@Pipe({
name: 'trustHtml'
})
export class TrustHtmlPipe implements PipeTransform {
constructor(readonly sr: DomSanitizer){}
transform(html: string) : SafeHtml {
return this.sr.bypassSecurityTrustHtml(html);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您有这样的管道,您AppComponent
将改为此.不要忘记将管道添加到您的声明数组中NgModule
:
@Component({
selector: 'app',
template: `<div [innerHtml]="htmlProperty | trustHtml"></div>`
})
export class AppComponent{
public htmlProperty: string = '<input type="text" name="name">';
}
Run Code Online (Sandbox Code Playgroud)
或者你可以写一个@Directive
来做同样的事情:
@Directive({
selector: '[trustHtml]'
})
export class SanitizeHtmlDirective {
@Input()
public set trustHtml(trustHtml: string) {
if (this._trustHtml !== trustHtml) {
this._trustHtml = trustHtml;
this.innerHtml = this.sr.bypassSecurityTrustHtml(this.trustHtml);
}
}
@HostBinding('innerHtml')
innerHtml?: SafeHtml;
private _trustHtml: string;
constructor(readonlysr: DomSanitizer){}
}
Run Code Online (Sandbox Code Playgroud)
如果您有这样的指令,您AppComponent
将改为此.不要忘记将指令添加到您的声明数组中NgModule
:
@Component({
selector: 'app',
template: `<div [trustHtml]="htmlProperty"></div>`
})
export class AppComponent{
public htmlProperty: string = '<input type="text" name="name">';
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
29356 次 |
最近记录: |