我正在尝试实施一个XML验证,它应该阻止XXE注入。 OWASP-Page上显示的代码与本机JDK8完美配合。
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(fSchema);
Validator validator = schema.newValidator();
validator.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
validator.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
validator.validate(new StreamSource(fXml));
问题是我在Wildfly10上使用此代码,其中Xerces2在内部使用(xercesImpl-2.11.0.SP4),并且无法识别所需的XMLConstants。
Exception in thread "main" org.xml.sax.SAXNotRecognizedException: Property 'http://javax.xml.XMLConstants/property/accessExternalDTD' is not recognized.
在具有给定Maven依赖性的单元测试中,问题可以简单地重现
<!-- https://mvnrepository.com/artifact/xerces/xercesImpl -->
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.11.0.SP4</version>
</dependency>
虽然可以使用参数
停用Wildfly10上的Xerces2-jaxpmodule&#34; javax.xml.jaxp-provider&#34;
这不是我想做的事。
有人知道如何正确配置Xerxces2以防止XXE注入......
答案 0 :(得分:2)
为避免强加XXE(外部XML实体)注入,
在逻辑部分中的代码下面设置以避免XXE注入。
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);