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

2022-09-03 00:16:00

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

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

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

如果没有,那么我应该如何继续?XML 解析器似乎有些过分。

注意:SO上有很多关于这个问题的问题,但所有答案都参考过滤所有HTML标签:我想保留有效的格式标签。


答案 1

我建议使用Jsoup。以下是其网站的相关摘录。

清理不受信任的 HTML

问题

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

溶液

将 jsoup HTML 清理程序白名单指定的配置一起使用。

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还提供了比这更多的优势。另请参阅 Java 中 HTML 解析器的优缺点


答案 2

你应该使用AntiSamy。(这就是我所做的)