2016-08-19 102 views
8

我正在实施防止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> 

但是这是行不通的,我怎么能解决这个问题?

+0

不应该排除javax.xml.bind.api或com.sun.xml.bind模块吗? –

+0

我正在使用'JAXP',因为我所做的就是解析一个xml。 AFAIK'JAXB'用于将XML文档绑定到java对象模型。 –

+0

另外,通过'-jaxpmodule'参数,jboss-modules.jar让我们指定'JAXP'模块实现。没有这样的参数可用于任何其他'JBoss'模块。这是否意味着它只是通过命令行来指定'JAXP'实现? –

回答

-1

而不是尝试从服务器的运行时中删除JAR。始终建议在运行时从项目中排除这些JAR。如果您使用Maven进行依赖关系管理,那么对于您的pom.xml中的特定JAR,您可以将此JAR的作用域提供为“provided”。提供的作用域表示此JAR将用于编译时,并且在运行时它将由运行时本身提供。

+0

如何使用maven排除由JBoss指定的依赖关系? –