如何配置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
答案 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,请务必谨慎。
如果您只想说,http
,https
和锚标记,那么我相信您运气不佳。
答案 2 :(得分:0)
回复得到3个upvotes根本没有回答这个问题。
OP中提到的github链接目前已合并,其他人正在寻找答案
Whitelist.relaxed().addProtocols("a", "href", "#")