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

时间:2010-08-05 09:17:10

标签: java html sanitization xss

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

我从富文本编辑器(例如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类对其他库/框架的外部依赖性尽可能小 - 对我来说是最好的。


那怎么样?

5 个答案:

答案 0 :(得分:21)

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

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

String safeHTML = policy.sanitize(untrustedHTML);

答案 1 :(得分:12)

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

它不仅具有HTML编码器,还具有执行JavaScript,CSS和URL编码的编码器。 Sample uses of ESAPI可以在OWASP发布的XSS预防备忘单中找到。

您可以使用OWASP AntiSamy项目来定义一个站点策略,该策略说明用户提交的内容中允许的内容。网站策略稍后可用于获取显示的“干净”HTML。您可以在TinyMCE policy file上找到示例 AntiSamy downloads page

答案 2 :(得分:6)

HTML转义输入非常有效。但在某些情况下,业务规则可能要求您不要逃避HTML。使用REGEX不适合任务,并且很难找到使用它的好解决方案。

我找到的最佳解决方案是使用:http://jsoup.org/cookbook/cleaning-html/whitelist-sanitizer

它使用提供的输入构建一个DOM树,并过滤白名单不能预先允许的任何元素。 API还具有其他用于清理html的功能。

它也可以用于javax.validation @SafeHtml(whitelistType =,additionalTags =)

答案 3 :(得分:4)

感谢@ Saljack的answer。只是详细说明OWASP Java HTML Sanitizer。它对我来说非常好(快)。我刚刚将以下内容添加到我的Maven项目中的pom.xml中:

UPDATE  tbl_AuditResults INNER JOIN DataFromExcel ON tbl_AuditResults.ID = DataFromExcel.AutoNum
SET     Result = TRUE, Notes = [4 Comment]
WHERE   DataFromExcel.[4] = 1 AND tbl_AuditResults.Param = 4

检查here以获取最新版本。

然后我添加了这个功能进行消毒:

    <dependency>
        <groupId>com.googlecode.owasp-java-html-sanitizer</groupId>
        <artifactId>owasp-java-html-sanitizer</artifactId>
        <version>20150501.1</version>
    </dependency>

可以通过在allowElements方法中扩展逗号分隔参数来添加更多标记。

只需在关闭Bean之前添加此行以保存数据:

    private String sanitizeHTML(String untrustedHTML){
        PolicyFactory policy = new HtmlPolicyBuilder()
            .allowAttributes("src").onElements("img")
            .allowAttributes("href").onElements("a")
            .allowStandardUrlProtocols()
            .allowElements(
            "a", "img"
            ).toFactory();

        return policy.sanitize(untrustedHTML); 
    }

就是这样!

对于更复杂的逻辑,这个库非常灵活,可以处理更复杂的清理实现。

答案 4 :(得分:0)

关于Antisamy,您可能需要检查有关依赖项的信息:​​

http://code.google.com/p/owaspantisamy/issues/detail?id=95&can=1&q=redyetidave