如何配置jsoup白名单以允许内部锚点

时间:2012-04-27 20:30:41

标签: java jsoup

如何配置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

3 个答案:

答案 0 :(得分:3)

Whitelist whitelist=new Whitelist();

Cleaner cleaner = new Cleaner(whitelist);

whitelist.addAttributes("a","accesskey","dir","lang","style","tabindex","title","href");

cleaner.clean(doc);

答案 1 :(得分:0)

如果没有提供协议/白名单,则隐式允许所有协议(请参阅isSafeAttribute)。如果您想允许内部锚点,那么您不需要在白名单的锚标记上调用addProtocol,不幸的是(至少在href上)。看起来有pull request来添加支持,但它从未合并过。

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

<a href="javascript:alert('Arbitrary code');">Some text</a>

如果您不信任您的HTML,请务必谨慎。

如果您只想说,httphttps和锚标记,那么我相信您运气不佳。

答案 2 :(得分:0)

回复得到3个upvotes根本没有回答这个问题。

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

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

Reference: Jsoup API Document