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

2022-09-01 05:49:54

我正在寻找class/util等来清理HTML代码,即删除危险的标签,属性和值,以避免XSS和类似的攻击。

我从富文本编辑器(例如TinyMCE)获得html代码,但它可以以恶意方式发送,省略TinyMCE验证(“数据提交表单异地”)。

有没有像PHP中的InputFilter这样简单易用的东西?我可以想象的完美解决方案是这样的(假设消毒器封装在HtmlSanitizer类中):

String unsanitized = "...<...>...";           // some potentially 
                                              // dangerous html here on input

HtmlSanitizer sat = new HtmlSanitizer();      // sanitizer util class created

String sanitized = sat.sanitize(unsanitized); // voila - sanitized is safe...

更新 - 解决方案越简单越好!小的util类,尽可能少地依赖其他库/框架 - 对我来说是最好的。


怎么样?


答案 1

您可以尝试OWASP Java HTML Sanitizer。它使用起来非常简单。

PolicyFactory policy = new HtmlPolicyBuilder()
    .allowElements("a")
    .allowUrlProtocols("https")
    .allowAttributes("href").onElements("a")
    .requireRelNofollowOnLinks()
    .build();

String safeHTML = policy.sanitize(untrustedHTML);

答案 2

您可以使用 OWASP ESAPI for Java,它是一个为执行此类操作而构建的安全库。

它不仅有用于HTML的编码器,还有编码器来执行JavaScript,CSS和URL编码。ESAPI 的示例用法可以在 OWASP 发布的 XSS 预防备忘单中找到。

可以使用 OWASP AntiSamy 项目来定义一个网站策略,该策略声明用户提交的内容中允许的内容。以后可以使用站点策略来获取显示回来的“干净”HTML。您可以在 AntiSamy 下载页面上找到示例 TinyMCE 策略文件