7

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

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

编辑

如果我使用Whitelist.relaxed().addProtocols("img","src","data"),则不会删除这些 img 标签。但它接受“data:”之后的任何内容,如果 src 内容以“data:;base64”开头,我只想保留它们。jsoup可以吗?

4

1 回答 1

11

您可以扩展 Whitelist 并覆盖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,因此我没有对此进行测试。

于 2014-06-30T19:57:11.607 回答