4

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

示例 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>

如果我手动构建 aWhitelist并添加我想要的标签和属性,但不调用,addProtocols(....)我可以让 jsoup 保留href原位,但这似乎不是一个好的解决方案,因为它不会过滤href掉包含 JavaScript。href例如,我希望从以下内容中删除a 标签(或至少是):

<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

4

3 回答 3

3
Whitelist whitelist=new Whitelist();

Cleaner cleaner = new Cleaner(whitelist);

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

cleaner.clean(doc);
于 2012-09-10T13:22:28.407 回答
0

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

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

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

因此,如果您不信任您的 HTML,请注意这一点。

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

于 2014-07-22T20:14:19.090 回答
0

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

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

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

参考:Jsoup API 文档

于 2018-05-14T07:12:07.457 回答