我有用户输入需要保存到后端并以HTML格式呈现给其他用户。它需要支持链接和CSS样式,但剥离JavaScript以避免XSS攻击。
考虑test = "<span style='color: red;'><strong>Test</strong></span><img src='#' onerror='alert(1)' hidden><script>alert(2)</script>"
的测试输入值。如果我使用DomSanitizer中的bypassSecurityTrustHtml,它会保留所有内容,包括不安全的JavaScript:
this.sanitizer.bypassSecurityTrustHtml(test)
// returns "<span style='color: red;'><strong>Test</strong></span><img src='#' onerror='alert(1)' hidden><script>alert(2)</script>"
但是,如果我使用sanitize方法,它会取出JavaScript但也会删除CSS:
this.sanitizer.sanitize(SecurityContext.HTML, test);
// returns "<span><strong>Test</strong></span><img src="#" hidden="">alert(2)"
我是否仍然使用DomSanitizer保留HTML和CSS但删除JavaScript?或者我需要使用另一个库吗?
答案 0 :(得分:2)
样式attrs是不安全的,所以如果你不信任你的用户110%,不要允许它们。您的应用程序只是最安全,因为它是最薄弱的环节。这可能是角度剥离它们的原因。如果你必须绕过这个,你需要另一个解决方案。
有许多方法可以使用样式进行xss,但考虑的事情很简单:
<a href="https://malicious.site" style="position:absolute;z-index:9999;top:0;left:0;bottom:0;right:0;opacity:0">You can't see me</a>