【问题标题】:Angular 2 DomSanitizer: Cannot trust both HTML and CSS without also allowing JavaScriptAngular 2 DomSanitizer:如果不允许 JavaScript,就不能同时信任 HTML 和 CSS
【发布时间】:2018-03-12 17:50:47
【问题描述】:

我有用户输入需要保存到后端并作为 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?还是我需要使用另一个库?

【问题讨论】:

    标签: angular xss


    【解决方案1】:

    样式属性并不安全,因此如果您不 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>
    

    【讨论】:

    • 感谢您的回复。我们确实需要允许 CSS,但只有一组严格的样式(主要是颜色、斜体等)。所以我可能必须找到一个库和/或编写一些代码来去除所有 JavaScript 并允许 CSS 样式的白名单。
    猜你喜欢
    • 2014-01-19
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    相关资源
    最近更新 更多