美文网首页Java 杂谈
Jsoup实战_2_WhiteList清理文档

Jsoup实战_2_WhiteList清理文档

作者: lkee6760 | 来源:发表于2018-05-21 21:28 被阅读49次
    图文无关,出处见水印

    在做网站的时候,经常会提供用户评论的功能。有些不怀好意的用户,会搞一些脚本到评论内容中,而这些脚本可能会破坏整个页面的行为,更严重的是获取一些机要信息,此时需要清理该HTML,以避免跨站脚本cross-site scripting攻击(XSS)。
    org.jsoup.safety.Whitelist是个清理器, 定义了什么html元素或者属性可以通过, 而其他的所有内容都将被删除。

    模板

    模板 允许标签或属性 简要说明
    none() 纯文本
    simpleText() b, em, i, strong, u 简单文本, 不包括属性
    basic() a[href(ftp, http, https, mailto), rel[nofollow]],
    b, blockquote[cite(http, https)], br, cite[cite(http, https)],
    code, dd, dl, dt, em, i, li, ol, p, pre, q[cite], small,
    strike, strong, sub, sup, u, ul
    基础白名单, 更加完整的文本节点和合适的属性
    basicWithImages() 同上, img[align, alt, height, src(http, https), title, width] 带照片的基础白名单, 除了和basic()有相同的标签外
    还增加了img标签
    relaxed() a[href(ftp, http, https, mailto), title], b,
    blockquote[cite(http, https)], br, caption, cite[cite(http, https)],
    code, col[span, width], colgroup[span, width], dd, dl, dt, em,
    h1, h2, h3, h4, h5, h6, i,
    img[align, alt, height, src((http, https)), title, width], li,
    ol[start, type], p, pre, q[cite((http, https))], small, strike,
    strong, sub, sup,
    table[summary, width], tbody, td[abbr, axis, colspan, rowspan, width], tfoot, th[abbr, axis, colspan, rowspan, scope, width],
    thead, tr, u, ul[type]
    较为宽松的白名单

    如果你想拓展这些模板, 可以通过以下方法, 但是需要格外小心

    addTags(java.lang.String...): 添加标签
    addAttributes(java.lang.String, java.lang.String...): 往指定标签中添加属性
    addEnforcedAttribute(java.lang.String, java.lang.String, java.lang.String): 往制定标签指定属性添加值
    addProtocols(java.lang.String, java.lang.String, java.lang.String...): 往制定标签制定属性添加协议
    

    当然你也可以从这些模板中过滤掉特定的标签或者属性

    removeTags(java.lang.String...)
    removeAttributes(java.lang.String, java.lang.String...)
    removeEnforcedAttribute(java.lang.String, java.lang.String)
    removeProtocols(java.lang.String, java.lang.String, java.lang.String...)
    

    实践

    故宫景点简介

    去除div标签及所有标签属性

    @Test
    public void func1() throws IOException {
    
        String url = "http://you.ctrip.com/sight/beijing1/229.html";
        Connection con = Jsoup.connect(url).timeout(30000);
        // 设置用户代理
        con.userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3192.0 Safari/537.36");
        Document doc = con.get();
        // 景点简介部分
        Element select = doc.selectFirst(".s_sight_infor");
        String clean = Jsoup.clean(select.html(), getImagesWhitelist());
        System.out.println(clean);
    
        Element imgTag = doc.selectFirst("div.s_sight_map img");
        String src = imgTag.attr("src");
        System.err.println("照片的链接: " + src);
    }
    
    public Whitelist getImagesWhitelist() {
        Whitelist images = Whitelist.none();
        images.addTags("ul", "img", "li", "dl", "dd", "dt");
        images.addAttributes("img", "src");
        return images;
    }
    
    爬取数据并清理后的效果

    参考内容

    1. Jsoup学习之Whitelist类
    2. 使用jsoup消除不受信任的HTML (来防止XSS攻击)

    相关文章

      网友评论

        本文标题:Jsoup实战_2_WhiteList清理文档

        本文链接:https://www.haomeiwen.com/subject/vvoqjftx.html