2016-08-19 55 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指定的依賴關係? –