我使用了SafeHtml
管道的变体,但是我想知道它实际上是如何在后台运行的。 Angular如何知道应用到DOM的文本已经通过管道传递并且是安全的?是在编译阶段完成还是在运行时检查?
调用任何bypassSecurityTrust ... API会禁用Angular的 对传入的值进行内置消毒
安全HTML管道的常见实现:
import { Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
@Pipe({name: 'sanitizeHtml'})
export class SanitizeHtmlPipe implements PipeTransform {
constructor(private _sanitizer:DomSanitizer) {
}
transform(v:string):SafeHtml {
return this._sanitizer.bypassSecurityTrustHtml(v);
}
}
更新:从dom_sanitization_service.ts source中找出来。 bypassSecurityTrustHtml
函数返回一个new SafeHtmlImpl(value);
实例。在sanitize
过程中,将进行检查:if (value instanceof SafeHtmlImpl)
,如果是,则跳过消毒过程
答案 0 :(得分:1)
我认为您误解了函数的要点。 它实际上并没有进行清理,甚至不检查HTML。 它所做的只是创建一个设置了标志的对象,因此Angular安全不会阻止它。如果该字符串包含不安全的HTML,则不会被阻止。
开发人员仍然应该自己编写一些函数或使用其他工具来确保HTML是安全的。