【问题标题】:Using jsoup to escape disallowed tags使用 jsoup 转义不允许的标签
【发布时间】:2012-03-10 23:52:42
【问题描述】:

我正在评估 jsoup 的功能,该功能将清理(但不删除!)非白名单标签。假设只允许<b> 标签,所以下面的输入

foo <b>bar</b> <script onLoad='stealYourCookies();'>baz</script>

必须产生以下内容:

foo <b>bar</b> &lt;script onLoad='stealYourCookies();'&gt;baz&lt;/script&gt;

我发现 jsoup 存在以下问题/疑问:

  • document.getAllElements() 始终假定 &lt;html&gt;&lt;head&gt;&lt;body&gt;。是的,我可以打电话给document.body().getAllElements(),但关键是我不知道我的来源是完整的 HTML 文档还是只是正文——我希望结果的形状和形式与它进来的一样;李>
  • 如何将&amp;lt;script&amp;gt;...&amp;lt;/script&amp;gt; 替换为&amp;lt;script&amp;gt;...&amp;lt;/script&amp;gt;?我只想用转义实体替换括号,不想更改任何属性等。Node.replaceWith 听起来有点矫枉过正。
  • 是否可以完全关闭漂亮的打印(例如插入新行等)?

或者我应该使用另一个框架?到目前为止,我已经查看了 htmlcleaner,但给出的示例并不表明我想要的功能得到支持。

【问题讨论】:

    标签: java html jsoup xss htmlcleaner


    【解决方案1】:

    回答 1

    如何使用 Jsoup 加载/解析 Document?如果您使用parse()connect().get(),jsoup 将自动格式化您的html(插入@​​987654328@、bodyhead 标签)。这确保您始终拥有完整的 Html 文档 - 即使输入不完整。

    假设您只想清理输入(没有进一步处理),您应该使用 clean() 而不是之前列出的方法。

    示例 1 - 使用 parse()

    final String html = "<b>a</b>";
    
    System.out.println(Jsoup.parse(html));
    

    输出:

    <html>
     <head></head>
     <body>
      <b>a</b>
     </body>
    </html>
    

    输入html已完成,以确保您拥有完整的文档。

    示例 2 - 使用 clean()

    final String html = "<b>a</b>";
    
    System.out.println(Jsoup.clean("<b>a</b>", Whitelist.relaxed()));
    

    输出:

    <b>a</b>
    

    输入的 html 被清理,而不是更多。

    文档:


    回答 2

    replaceWith() 方法完全符合您的需要:

    示例:

    final String html = "<b><script>your script here</script></b>";
    Document doc = Jsoup.parse(html);
    
    for( Element element : doc.select("script") )
    {
        element.replaceWith(TextNode.createFromEncoded(element.toString(), null));
    }
    
    System.out.println(doc);
    

    输出:

    <html>
     <head></head>
     <body>
      <b>&lt;script&gt;your script here&lt;/script&gt;</b>
     </body>
    </html>
    

    只有正文

    System.out.println(doc.body().html());
    

    输出:

    <b>&lt;script&gt;your script here&lt;/script&gt;</b>
    

    文档:


    答案 3

    是的,Jsoup.OutputSettingsprettyPrint() 方法可以做到这一点。

    示例:

    final String html = "<p>your html here</p>";
    
    Document doc = Jsoup.parse(html);
    doc.outputSettings().prettyPrint(false);
    
    System.out.println(doc);
    

    注意:如果outputSettings()方法不可用,请更新Jsoup。

    输出:

    <html><head></head><body><p>your html here</p></body></html>
    

    文档:


    答案 4 (没有项目符号)

    不! Jsoup 是目前最好的和最功能的 HTML 库之一!

    【讨论】:

    • 哇,感谢您提供非常详细的回答!我现在有点脱离这个问题的背景,但稍后会看看这个。
    猜你喜欢
    • 2016-11-14
    • 2017-01-03
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多