如何使Jsoup白名单接受某些属性内容

时间:2014-03-16 22:50:34

标签: java jsoup sanitization html-sanitizing

我使用Jsoup和轻松的白名单。它看起来很完美,但我想保留嵌入式图像标签,如<img alt="" src="data:;base64

有没有办法修改白名单以接受那些img?

修改

如果我使用Whitelist.relaxed().addProtocols("img","src","data"),则不会删除这些img标记。但它接受了&#34;数据之后的任何事情:&#34;如果src内容以&#34; data :; base64&#34;开头,我想保留它们。是不是可以用jsoup?

1 个答案:

答案 0 :(得分:9)

您可以扩展白名单并覆盖isSafeAttribute以执行自定义检查。由于无法直接扩展Whitelist.relaxed(),您必须复制一些代码才能设置相同的列表:

public class RelaxedPlusDataBase64Images extends Whitelist {
    public RelaxedPlusDataBase64Images() {
        //copied from Whitelist.relaxed()
        addTags("a", "b", "blockquote", "br", "caption", "cite", "code", "col",
                "colgroup", "dd", "div", "dl", "dt", "em", "h1", "h2", "h3", "h4", "h5", "h6",
                "i", "img", "li", "ol", "p", "pre", "q", "small", "strike", "strong",
                "sub", "sup", "table", "tbody", "td", "tfoot", "th", "thead", "tr", "u",
                "ul");
        addAttributes("a", "href", "title");
        addAttributes("blockquote", "cite");
        addAttributes("col", "span", "width");
        addAttributes("colgroup", "span", "width");
        addAttributes("img", "align", "alt", "height", "src", "title", "width");
        addAttributes("ol", "start", "type");
        addAttributes("q", "cite");
        addAttributes("table", "summary", "width");
        addAttributes("td", "abbr", "axis", "colspan", "rowspan", "width");
        addAttributes("th", "abbr", "axis", "colspan", "rowspan", "scope", "width");
        addAttributes("ul", "type");
        addProtocols("a", "href", "ftp", "http", "https", "mailto");
        addProtocols("blockquote", "cite", "http", "https");
        addProtocols("cite", "cite", "http", "https");
        addProtocols("img", "src", "http", "https");
        addProtocols("q", "cite", "http", "https");
    }

    @Override
    protected boolean isSafeAttribute(String tagName, Element el, Attribute attr) {
        return ("img".equals(tagName)
                && "src".equals(attr.getKey())
                && attr.getValue().startsWith("data:;base64")) ||
            super.isSafeAttribute(tagName, el, attr);
    }
}

由于您还没有提供用于解析的代码或您正在进行消毒的HTML,我还没有对此进行测试。