对于使用Java原生DOM和SAX以及DOM4J有以下两种修复方法(这里以SAXParserFactory为例):
//仅限Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#disallow-doctype-decl
saxParserFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);
2.如果无法完全禁用DTD,可以采用以下操作一起使用
saxParserFactory.setFeature("http://javax.xml.XMLConstants/feature/secure-processing", true);
saxParserFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",false);
saxParserFactory.setXIncludeAware(false);
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);