OWASP HTML Sanitizer允许在HTML中使用冒号

时间:2015-09-30 02:51:18

标签: javamail xss owasp html-sanitizing

如何允许:签署已清理的HTML?我用它来生成java邮件时清理HTML代码。此代码的内嵌图像内容ID类似于<img src=\"cid:image\" height=\"70\" width=\"70\" />。清理后,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" />

1 个答案:

答案 0 :(得分:8)

为什么它不起作用

或者更确切地说,为什么它工作得太好&#34;

默认情况下,HtmlPolicyBuilder不允许src元素中的网址协议。这可以防止注射,例如

<img src="javascript:alert('xss')"/>

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

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

即使它没有使用javascript协议,它仍然可以注入base64编码的XSS注入:

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

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

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

如何修复它:

您必须使用allowUrlProtocols method明确告诉HtmlPolicyBuilder允许 cid &#34;协议&#34;:

    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" />