我都通过了有关这两个功能的角度文档
绕过安全性,并将给定的值信任为安全样式URL,即可以在超链接或
<img src>
中使用的值
bypassSecurityTrustResourceUrl其中
绕过安全性并将给定值信任为安全的资源URL,即可以用来从中加载可执行代码的位置,例如
<script src>
或<iframe src>
。
以上两者均用于绕过安全性和信任。
我绕过<img src>
的Blob URL,因此在阅读文档之前,我的IDE(vscode)提供了以上两个功能,我使用了bypassSecurityTrustResourceUrl
,我的代码就像...这个。
component.ts
this.fileService.getFileBlobUrl(imgsrc).subscribe(url => {
this.domSanitizer.bypassSecurityTrustResourceUrl
user.bloburl = this.domSanitizer.bypassSecurityTrustResourceUrl(url);
});
component.html
<img [src]="user.bloburl" class="avatar" alt="avatar">
根据文档bypassSecurityTrustUrl
应该可以正常工作。但是我用了'bypassSecurityTrustResourceUrl'
它实际上正在工作!!!!
所以我的问题是这两个功能之间有什么区别。为什么可以使用两个不同的功能?
答案 0 :(得分:1)
我实际上是为SafeValue
创建管道,对此也很感兴趣。所以我开始挖掘,这是我发现的东西:
DomSanitizationService: sanitization()
:
case SecurityContext.URL:
const type = getSanitizationBypassType(value);
if (allowSanitizationBypassOrThrow(value, BypassType.Url)) {
return unwrapSafeValue(value);
}
return _sanitizeUrl(String(value));
case SecurityContext.RESOURCE_URL:
if (allowSanitizationBypassOrThrow(value, BypassType.ResourceUrl)) {
return unwrapSafeValue(value);
}
因此,unwrapSafeValue
函数在两种类型中都被调用,但是下面有:
bypassSecurityTrustUrl(value: string): SafeUrl {
return bypassSanitizationTrustUrl(value);
}
bypassSecurityTrustResourceUrl(value: string): SafeResourceUrl {
return bypassSanitizationTrustResourceUrl(value);
}
因此,这里调用了2个不同的函数,让我们更进一步。
在sanitization/bypass.ts中,我们可以找到:
export function bypassSanitizationTrustUrl(trustedUrl: string): SafeUrl {
return new SafeUrlImpl(trustedUrl);
}
export function bypassSanitizationTrustResourceUrl(trustedResourceUrl: string): SafeResourceUrl {
return new SafeResourceUrlImpl(trustedResourceUrl);
}
几行之后,我们可以发现它们之间的唯一区别在于返回的类:
class SafeUrlImpl extends SafeValueImpl implements SafeUrl {
getTypeName() { return BypassType.Url; }
}
class SafeResourceUrlImpl extends SafeValueImpl implements SafeResourceUrl {
getTypeName() { return BypassType.ResourceUrl; }
}
并且由于
if (actualType != null && actualType !== type) {
// Allow ResourceURLs in URL contexts, they are strictly more trusted.
if (actualType === BypassType.ResourceUrl && type === BypassType.Url) return true;
throw new Error(
`Required a safe ${type}, got a ${actualType} (see http://g.co/ng/security#xss)`);
}
现在我们知道ResourceUrl
所在的任何地方都允许使用Url
。
答案 1 :(得分:0)
我发现我在清理图像或视频时需要使用bypassSecurityTrustResourceUrl,而在清理包含pdf或word或excel等应用程序内容的文件时,则需要使用bypassSecurityTrustUrl。