对于使用Java原生DOM和SAX以及DOM4J有以下两种修复方法(这里以SAXParserFactory为例):

    1. //仅限Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#disallow-doctype-decl
    2. saxParserFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);

    2.如果无法完全禁用DTD,可以采用以下操作一起使用

    1. saxParserFactory.setFeature("http://javax.xml.XMLConstants/feature/secure-processing", true);
    1. saxParserFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",false);
    1. saxParserFactory.setXIncludeAware(false);
    2. saxParserFactory.setExpandEntityReferences(false);

    上述设置功能的方法setFeature也可以换成setAttribute,setAttribute方法用于用户在底层设置特定属性,使用方法和效果是一样的。
    上述防御需要Java 7 Update 67,Java 8 Update 20或更高版本,因为DocumentBuilderFactory和SAXParserFactory的上述对策在早期Java版本中被破坏。
    也可以从其他类上着手防范xxe漏洞:
    如XMLInputFactory、TransformerFactory、Validator、SchemaFactory、SAXTransformerFactory。但这些类都是调用了XMLConstants中的属性,故需要支持JAXP1.5.使用STAX解析xml文件时,可使用下面方法进行防范(这里仅用XMLInputFactory类做为例子:其他类的防护手段类似):

    //这将完全禁用该工厂的DTD
    xmlInputFactory.setProperty(XMLInputFactory.SUPPORT_DTD,false);
    //禁用替换内部实体引用
    xmlInputFactory.setProperty(“javax.xml.stream.isReplacingEntityReferences”,false);