(看来我的问题与在 chrome 中出现错误“此文档需要 'TrustedHTML' assignment”有关,但我使用的是 Angular v10)
描述:
当我[innerHTML]="myVar"
在 Angular 10(或更低版本)项目上使用该指令时,使用严格的 CSP require-trusted-types-for 'script';
,它会失败并显示以下消息:
此文档需要“TrustedHTML”分配。错误类型错误:无法在“元素”上设置“innerHTML”属性:此文档需要“TrustedHTML”分配。
如何重现:
- 打开一个 Angular X 项目
[innerHTML]="someVar"
在模板中使用指令- 添加
require-trusted-types-for 'script';
CSP 标头 - 检查 Chrome 控制台;)
我尝试了什么:
在阅读了有关受信任类型的一些资料后,例如:
- https://web.dev/trusted-types/
- https://www.intricatecloud.io/2019/10/using-angular-innerhtml-to-display-user-generated-content-without-sacrificing-security/
我尝试在我的 Angular 项目中使用https://github.com/cure53/DOMPurify 。只需添加包,创建一个 Angular 管道,然后在模板中使用它。
可以使用以下代码创建管道:
import { Pipe, PipeTransform } from '@angular/core';
import * as DOMPurify from 'dompurify';
@Pipe({
name: 'safeHtml'
})
export class SafeHtmlPipe implements PipeTransform {
transform(value: string): TrustedHTML {
return DOMPurify.sanitize(value, {RETURN_TRUSTED_TYPE: true});
}
}
它可以像这样使用:[innerHTML]="myVar | safeHtml"
当然,我用 a 检查了返回console.log
,它给了我一个真正的 TrustedHTML 对象。Chrome 控制台中弹出了新错误,因此我不得不添加一个新的 CSP 标头来授权 DOMPurify:
require-trusted-types-for 'script';trusted-types dompurify
在那之后,Chrome 很高兴看到了 DOMPurify 字符串操作。
然而,最初的错误再次出现!
我不明白我错过了什么 - Chrome 抱怨 innerHTML 调用中的 TrustedHTML 类型,所以我做了一个 TrustedHTML 转换。在那之后 Chrome 想要一个明确的 dompurify 授权,所以我这样做了,然后 Chrome 再次抱怨 TrustedHTML 类型......