jboss-deployment-structure.xml添加 JAXP 排除项
我正在实现XML验证,以防止XXE(外部XML实体)注入。我从OWASP XXE预防备忘单中借用了一些代码。我的代码看起来像这样 -
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(xsdFileURL);
Validator validator = schema.newValidator();
validator.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
validator.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
validator.validate(new StreamSource(new StringReader(xml)));
代码在我的本地Windows机器(JDK 1.8.0_92,Wildfly 8.2)上正常运行。但是在具有类似配置的QA Red Hat机器上(JDK - 1.8.0_101,Wildfly 8.2),它会抛出一个异常,并显示以下消息:
Property 'http://javax.xml.XMLConstants/property/accessExternalDTD' is not recognized.
经过一些阅读,我怀疑在运行时,正在为类读取不正确的类定义。如何解决此问题?validator
更新
事实证明,Jboss 附带了自己的 实现,我的代码需要从 JDK 而不是从 JBoss 中选择 JAXP 实现。我可以通过传入参数轻松做到这一点(使用这个,我的代码也选择了正确的JAXP实现) -JAXP
-jaxpmodule
standalone.sh
java -jar jboss-modules.jar -jaxpmodule "javax.xml.jaxp-provider"
但是我想使用jboss-deployment-structure来做到这一点.xml并添加这样的排除项 -
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<deployment>
<exclusions>
<module name="javax.api" /> // is the module name correct?
</exclusions>
</deployment>
</jboss-deployment-structure>
但这不起作用,我该如何解决这个问题?