如何清理HTML代码以防止Java或JSP中的XSS攻击?

时间:2010-08-27 18:47:05

标签: java jsp xss

我正在编写一个基于servlet的应用程序,我需要在其中提供一个消息传递系统。我匆忙,所以我选择CKEditor来提供编辑功能,我目前直接在显示所有消息的网页中插入生成的html(消息存储在MySQL数据库中,fyi)。 CKEditor已经基于白名单过滤HTML,但是用户仍然可以使用POST请求注入恶意代码,所以这还不够。

一个好的库已经存在,可以通过过滤HTML标签来防止XSS攻击,但它是用PHP编写的:HTML Purifier

那么,是否有类似的成熟库可以在Java中使用? 基于白名单的简单字符串替换似乎不够,因为我也想过滤格式错误的标签(这可能会改变显示消息的页面的设计)

如果没有,那我该怎么办? XML解析器似乎有些过分。

注意:在SO上有很多关于此的问题,但所有答案都涉及过滤所有HTML标记:我想保留有效的格式化标记。

3 个答案:

答案 0 :(得分:22)

我建议您使用Jsoup。以下是its site的相关摘录。

  

Sanitize untrusted HTML

     

问题

     

您希望允许不受信任的用户为您网站上的输出提供HTML(例如,作为评论提交)。您需要清除此HTML以避免cross-site scripting(XSS)攻击。

     

解决方案

     

将jsoup HTML CleanerWhitelist指定的配置一起使用。

String unsafe = 
      "<p><a href='http://example.com/' onclick='stealCookies()'>Link</a></p>";
String safe = Jsoup.clean(unsafe, Whitelist.basic());
      // now: <p><a href="http://example.com/" rel="nofollow">Link</a></p>

Jsoup也提供了更多的优势。另请参阅Pros and Cons of HTML parsers in Java

答案 1 :(得分:9)

您应该使用AntiSamy。 (That's what I did

答案 2 :(得分:2)

如果现成的选项都不够,那么Google Code就会有一系列关于XSS和攻击预防的优秀文章。它应该提供大量的信息,如果你最终走这条路。