jakarta-mail - OWASP HTML Sanitizer 允许在 HTML 中使用冒号

标签 jakarta-mail xss owasp html-sanitizing

我怎样才能允许:登录经过净化的 HTML?我用它来清理生成 java 邮件时的 HTML 代码。此代码有一个内联图像内容 ID,如 <img src=\"cid:image\" height=\"70\" width=\"70\" /> 。 sanitizer 后,src属性未包含在清理后的 html 中。

    PolicyFactory IMAGES = new HtmlPolicyBuilder().allowUrlProtocols("http", "https")
            .allowElements("img")
            .allowAttributes("src").matching(Pattern.compile("^cid[:][\\w]+$"))
            .onElements("img")
            .allowAttributes("border", "height", "width").onElements("img")
            .toFactory();

    String html = "<img src=\"cid:image\"  height=\"70\" width=\"70\" />";
    final String sanitized = IMAGES.sanitize(html);

    System.out.println(sanitized);

以上代码的输出为:

<img height="70" width="70" />

最佳答案

为什么它不起作用

或者更确切地说,为什么它工作得“太好了”

默认情况下,HtmlPolicyBuilder 不允许在 src 元素中使用 URL 协议(protocol)。这可以防止诸如

之类的注入(inject)
<img src="javascript:alert('xss')"/>

这可能会导致在 javascript: 之后执行脚本(在本例中为 alert('xss'))

还有其他协议(protocol)(在其他元素上)可能会导致类似问题:

即使它不使用javascript协议(protocol),仍然可以注入(inject)base64编码的XSS注入(inject):

<object src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4="/> 

<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">Click me</a>

因此,HtmlPolicyBuilder 假定任何包含冒号的属性值(在某些属性中)都应被视为危险。

<小时/>

如何修复它:

您必须使用allowUrlProtocols method明确告诉HtmlPolicyBuilder允许cid“协议(protocol)” :

    PolicyFactory IMAGES = new HtmlPolicyBuilder().allowUrlProtocols("http", "https")
            .allowElements("img")
            .allowUrlProtocols("cid") // Specifically allow "cid"
            .allowAttributes("src").matching(Pattern.compile("^cid[:][\\w]+$"))
            .onElements("img")
            .allowAttributes("border", "height", "width").onElements("img")
            .toFactory();

    String html = "<img src=\"cid:image\"  height=\"70\" width=\"70\" />";
    final String sanitized = IMAGES.sanitize(html);

    System.out.println(sanitized);

输出:

<img src="cid:image" height="70" width="70" />

关于jakarta-mail - OWASP HTML Sanitizer 允许在 HTML 中使用冒号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32856950/

相关文章:

java - 改变 multipart/XXX 内容类型而不改变底层部分

asp.net - HttpRequestValidationException 和跨站脚本 XSS

javascript - 不涉及服务器的 XSS - 这危险吗?

http - 如何利用HTTP "Host"header XSS漏洞?

java - CSRFGuard 和保护电子邮件中发送的页面链接

linux - docker:来自守护进程的错误响应:无效模式:/usr/src/app

Javamail IMAP - 按日期搜索邮件返回错误结果

JavaMail 和电子邮件帐户的连接

java - 无法通过 javamail 发送 zip 文件

java - 抑制某些依赖项中 JAR 的 OWASP 结果