我正在尝试从我的数据库中获取第三方(潜在的不安全的)html内容,并将其插入到我的html文档中。
如何安全地做到这一点(针对XSS的保护)?
在Angular1.x中,以前有$sce
来清理输入,在Angular2中如何做到这一点?据我理解,Angular2默认情况下自动对其进行消毒,是这样吗?
像这样的东西是行不通的:
<div class="foo">
{{someBoundValueWithSafeHTML}} // I want HTML from db here
</div>
要将普通HTML插入到angular2应用程序中,可以使用[innerHtml]
指令。
<div [innerHtml]="htmlProperty"></div>
这对HTML是行不通的,因为HTML有自己的组件和指令,至少不是以您所期望的方式。
但是,如果您确实得到了不安全的html警告,那么在注入html
之前,您应该首先信任它。对于这样的事情,您必须使用domsanitizer
。例如,
元素不是。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){}
}
<div [innerHtml]="htmlProperty"></div>
如果您打算更多地使用此技术,可以尝试编写@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);
}
}
如果您有这样的管道,您的AppComponent
将更改为这个。不要忘记将管道添加到ngmodule
的声明数组中:
@Component({
selector: 'app',
template: `<div [innerHtml]="htmlProperty | trustHtml"></div>`
})
export class AppComponent{
public htmlProperty: string = '<input type="text" name="name">';
}
也可以编写@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(readonly sr: DomSanitizer){}
}
如果您有这样的指令,您的AppComponent
将更改为这个。不要忘记将指令添加到ngmodule
的声明数组中:
@Component({
selector: 'app',
template: `<div [trustHtml]="htmlProperty"></div>`
})
export class AppComponent{
public htmlProperty: string = '<input type="text" name="name">';
}
null
另一个选项是使用simple_format或.html_safe或sanitize(fieldname)在视图中显示数据时进行sanitize。我应该在每个字段的所有视图中以及插入上进行消毒吗?在任何地方都必须手动执行此操作似乎不是很有条不紊 谢谢你的帮助
大家好我想发送数据选择选项 Html TS optValue是只有名字的事件但我需要t 谢谢你!
在ts 中禁用... 我只想禁用基于<code>true</code>或<code>false</code>的输入。 我尝试了以下几点: