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

如何清理Java中的HTML代码以防止XSS攻击?,java,html,sanitization,xss,Java,Html,Sanitization,Xss,我正在寻找class/util等来清理HTML代码,即删除危险的标记、属性和值,以避免XSS和类似的攻击 我从富文本编辑器(例如TinyMCE)中获得html代码,但它可以通过恶意方式发送,不允许TinyMCE验证(“数据提交表单非现场”) 在PHP中有没有像InputFilter这样简单的东西?我能想象的完美解决方案是这样工作的(假设消毒剂封装在HtmlSanitizer类中): 字符串未初始化=“…”;//一些潜在的 //在这里输入危险的html HtmlSanitizer sat=新Htm

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

我从富文本编辑器(例如TinyMCE)中获得html代码,但它可以通过恶意方式发送,不允许TinyMCE验证(“数据提交表单非现场”)

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

字符串未初始化=“…”;//一些潜在的
//在这里输入危险的html
HtmlSanitizer sat=新HtmlSanitizer();//已创建消毒器util类
字符串已清除=sat.sanitize(未清除);//瞧,消毒是安全的。。。

更新-解决方案越简单越好!对其他库/框架具有尽可能少的外部依赖性的小型util类对我来说是最好的


怎么样?

您可以使用,这是一个为执行此类操作而构建的安全库

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


您可以使用该项目定义一个站点策略,该策略声明用户提交的内容中允许的内容。站点策略稍后可用于获取显示在后面的“干净”HTML。您可以在上找到有关反配偶的示例。

,您可能需要检查有关依赖关系的示例:


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

我找到的最佳解决方案是使用:

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

它还可以与javax.validation@SafeHtml(whitelistType=,additionalTags=)一起使用。

您可以尝试。它使用起来非常简单

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

String safeHTML = policy.sanitize(untrustedHTML);
多亏了@Saljack's。我只是想详细说明一下。这对我来说真的很好(很快)。我刚刚在Maven项目的pom.xml中添加了以下内容:

    <dependency>
        <groupId>com.googlecode.owasp-java-html-sanitizer</groupId>
        <artifactId>owasp-java-html-sanitizer</artifactId>
        <version>20150501.1</version>
    </dependency>
通过扩展allowElements方法中的逗号分隔参数,可以添加更多标记

在传递bean以保存数据之前,只需添加以下行:

    bean.setHtml(sanitizeHTML(bean.getHtml()));
就这样


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

这需要重建整个项目的体系结构。我不愿意做这件事。我需要一些简单的东西,没有很多依赖项,也不需要改变我的代码的组织方式(我喜欢现在的方式)。所以-我只需要一个util类来完成这项工作。我的问题现在被更新以澄清这一需求。我不确定你所说的重建项目架构是什么意思。通过允许文本编辑器输入被输入到由site policy.Hmmm驱动的过滤库中,AntiSamy完全符合您的要求。看来你是对的!我只是认为它是一个大而重的框架,比如struts、spring等,可以作为某种servlet过滤器;-)。可能是名字中的大字(“OWASP”)误导了我。顺便说一句:OWASP AntiSamy的确切依赖关系是什么?我还需要使用什么?AntiSamy POM可能会给你一个提示(后面提供的链接来自SVN,不应该直接使用)。它确实需要一些其他的库,但我不确定AntiSamy如何在内部使用它们。参考:仅供参考,旨在提供一种更高效、更易于配置的反垃圾邮件替代方案。因此,您基本上希望客户能够提交表单,然后以fx的形式显示。留言簿?你希望他们能够使用html,但你仍然希望能够阻止恶意用户的黑客企图?还是我完全搞错了…?@Latze:我希望客户端(通过浏览器的用户)提交richtext内容(通过richtext editor-TinyMCE提交html格式),但检查并删除任何潜在危险(不安全)的内容。我不知道你在这里提到的外汇和留言簿是什么。啊!我来试试,给我几分钟
    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); 
    }
    bean.setHtml(sanitizeHTML(bean.getHtml()));