我正在實施防止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'實現? –