BypassSecurityTrustResourceUrl和bypassSecurityTrustUrl有什么区别

时间:2019-06-12 10:58:53

标签: angular angular8 angular2-security

我都通过了有关这两个功能的角度文档

bypassSecurityTrustUrl其中

  

绕过安全性,并将给定的值信任为安全样式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'

它实际上正在工作!!!!

所以我的问题是这两个功能之间有什么区别。为什么可以使用两个不同的功能?

2 个答案:

答案 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函数在两种类型中都被调用,但是下面有:

DomSanitizationService:

  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。