2012-04-27 97 views
4

如何配置jsoup Whitelist以允许内部定位点引用,但不允许任何值?如何配置jsoup白名单以允许内部定位点

HTML示例:

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

如果我试图用轻松的Whitelisthref清洁代码被删除。

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。例如,我想从下面取出一个标签(或至少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
Whitelist whitelist=new Whitelist(); 

Cleaner cleaner = new Cleaner(whitelist); 

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

cleaner.clean(doc); 
0

如果提供/白名单没有任何协议,那么所有的人是隐含允许的(见isSafeAttribute)。如果你想允许内部定位,那么你不需要在你的白名单的定位标记上拨打addProtocol,不幸的是(至少在href)。看起来有一个pull request来增加支持,但它从来没有合并过。

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

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

所以要特别小心的是,如果你不信任你的HTML。

如果你只想说,http,https和锚标签,那么我相信你是运气不好。