【问题标题】:How to configure jsoup whitelist to allow internal anchor如何配置jsoup白名单以允许内部锚点
【发布时间】:2012-04-27 20:30:41
【问题描述】:

如何配置 jsoup Whitelist 以允许内部锚引用,而不允许任何任意值?

示例 html:

<a href="#section1" target="_self">Jump To Section 1</a>
    <!-- ... -->
<a name="section1">Section 1</a>

如果我尝试使用宽松的Whitelist 清理代码,href 将被删除。

Jsoup.clean(html, Whitelist.relaxed().addAttributes("a", "name", "target");

返回以下内容:

<a target="_self">Jump To Section 1</a>
   <!-- ... -->
<a name="section1">Section 1</a>

如果我手动构建 Whitelist 并添加我想要的标签和属性,但不要调用 addProtocols(....),我可以让 jsoup 将 href 留在原处,但这看起来不像很好的解决方案,因为它不会过滤掉包含 JavaScript 的 href。例如,我希望从以下内容中删除 a 标签(或至少 href):

<a href="javascript:alert(1111);" target="_self">Jump To Section 1</a>
<a name="section1">Section 1</a>

jsoup 可以做到吗?

我确实看到了以下向 jsoup 提交的补丁,但它看起来并没有进入 jsoup 代码库:https://github.com/jhy/jsoup/pull/77

【问题讨论】:

    标签: java jsoup


    【解决方案1】:
    Whitelist whitelist=new Whitelist();
    
    Cleaner cleaner = new Cleaner(whitelist);
    
    whitelist.addAttributes("a","accesskey","dir","lang","style","tabindex","title","href");
    
    cleaner.clean(doc);
    

    【讨论】:

      【解决方案2】:

      如果没有提供协议/将其列入白名单,则所有协议都被隐式允许(请参阅isSafeAttribute)。如果您想允许内部锚点,那么您永远不需要在白名单的锚点标签上调用addProtocol,不幸的是(至少在href 上)。似乎有一个 pull request 来添加支持,但它从未合并。

      请注意,如果您允许所有协议,恶意用户可以在链接点击时运行 Javascript:

      &lt;a href="javascript:alert('Arbitrary code');"&gt;Some text&lt;/a&gt;

      如果您不信任您的 HTML,请务必小心。

      如果你只想允许httphttps 和锚标签,那么我相信你不走运。

      【讨论】:

        【解决方案3】:

        得到 3 票赞成的回复根本没有回答问题。

        OP中提到的github链接目前已合并,供其他正在寻找答案的人

        Whitelist.relaxed().addProtocols("a", "href", "#")
        

        Reference: Jsoup API Document

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-13
          • 1970-01-01
          • 2019-03-29
          • 1970-01-01
          • 2016-06-05
          • 2017-01-21
          • 2010-12-30
          • 1970-01-01
          相关资源
          最近更新 更多