我正在编写一个基于servlet的应用程序,其中需要提供一个消息传递系统。我很着急,所以我选择CKEditor提供编辑功能,目前我将生成的html直接插入显示所有消息的网页中(消息存储在MySQL数据库中,fyi)。CKEditor已经基于白名单过滤HTML,但是用户仍然可以通过POST请求注入恶意代码,因此这还不够。
一个好的库已经存在,可以通过过滤HTML标记来防止XSS攻击,但是它是用PHP编写的:HTML Purifier
那么, 有没有类似的成熟库可以在Java中使用 ?基于白名单的简单字符串替换似乎还不够,因为 我也想过滤格式错误的标签 (这可能会更改显示消息的页面的设计)。
如果没有,那我应该怎么做?XML解析器似乎过大了。
注意:关于SO的问题很多,但是所有答案都涉及过滤所有HTML标签:我想保留有效的格式标签。
我建议为此使用Jsoup。
问题 您想允许不受信任的用户提供HTML以在您的网站上输出(例如,作为评论提交)。您需要清除此HTML,以避免跨站点脚本(XSS)攻击。
解 将jsoup HTML Cleaner用于由指定的配置Whitelist。
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>