为什么DomSanitizer对于字符串值不起作用?

时间:2019-06-13 17:38:05

标签: angular typescript iframe cross-site angular-dom-sanitizer

目标:将字符串变量从Angular应用程序(typesript)发送到另一台服务器上的iFrame,以便可以在有条件的情况下使用

问题:如何将DomSanitizer专门用于变量?

文档状态类型为:HTML,样式,脚本,网址。如果我只想发送纯字符串变量怎么办?文档尚不清楚。

SecurityContext显示相同的https://angular.io/api/core/SecurityContext。我尝试了脚本。我也尝试过消毒方法,但是它需要安全上下文。

我尝试使用脚本,但出现错误: 错误:在资源URL上下文中使用了不安全的值(请参见http://g.co/ng/security#xss)     在DomSanitizerImpl.push ../ node_modules/@angular/platform-b​​rowser/fesm5/platform-b​​rowser.js.DomSanitizerImpl.sanitize

我阅读了(http://g.co/ng/security#xss和(https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#Security_concerns)以及其他有关domsanitizer,后期消息,Angular生命周期等的文章 我尝试将代码放置在文件的不同区域,包括onload等。

chat.component.html:

<div class="iframe-container"> 
    <iframe id="iframe_chatui" src="{{ chatURL }}/loading.html" class="chatiframe" allow="microphone; camera"></iframe>
</div>

chat.component.ts:

ngAfterViewInit() {        
        this.safeScript = this.domSanitizer.bypassSecurityTrustScript(this.localeId);
        let frame = document.getElementById('iframe_chatui');           
    }

添加以下内容时,出现错误:无法读取null的属性'contentWindow'

let frame = document.getElementById('iframe_chatui') as HTMLIFrameElement;       
frame.contentWindow.postMessage(this.localeId, '*');

1 个答案:

答案 0 :(得分:0)

尝试使用 bypassSecurityTrustResourceUrl 绕过角度安全性。然后使用函数中的该值调用iframe。

但是要非常小心,您正在绕过内置的角度安全机制。如果您信任该URL,请确保该URL仅来自您的来源,然后就可以使用该功能。

以下是角度文档的链接: https://angular.io/api/platform-browser/DomSanitizer#bypassSecurityTrustResourceUrl

我建议阅读有关owasp网站上可能发生的URL攻击的建议。确保您的网址通过了以下链接中提及的正则表达式: https://www.owasp.org/index.php/OWASP_Validation_Regex_Repository