我正在实施防止XXE(外部XML实体)注入的XML验证。我借用OWASP XXE Prevention Cheat Sheet的一些代码。我的代码看起来是这样的 -jboss-deployment-structure.xml添加JAXP排除
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红帽机具有类似配置(JDK - 1.8.0_101,Wildfly 8.2),它抛出一个异常与消息 -
Property 'http://javax.xml.XMLConstants/property/accessExternalDTD' is not recognized.
一些阅读我的怀疑之后就是运行期间,不正确的类定义正在为validator
类读取。我该如何解决?
更新
原来的Jboss都有自己的执行JAXP
,我的代码需要挑选从JDK中的JAXP实现,而不是从JBoss的。我可以在standalone.sh
传递-jaxpmodule
参数做到这一点很容易(用这个,我的代码选择了正确的JAXP实现以及) -
java -jar jboss-modules.jar -jaxpmodule "javax.xml.jaxp-provider"
但我想做到这一点使用JBoss的部署,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>
但是这是行不通的,我怎么能解决这个问题?
不应该排除javax.xml.bind.api或com.sun.xml.bind模块吗? –
我正在使用'JAXP',因为我所做的就是解析一个xml。 AFAIK'JAXB'用于将XML文档绑定到java对象模型。 –
另外,通过'-jaxpmodule'参数,jboss-modules.jar让我们指定'JAXP'模块实现。没有这样的参数可用于任何其他'JBoss'模块。这是否意味着它只是通过命令行来指定'JAXP'实现? –