jboss-deployment-structure.xml添加JAXP排除

Ank*_*agi 13 java xml jboss spring jaxp

我正在实现防止XXE(外部XML实体)注入的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)));
Run Code Online (Sandbox Code Playgroud)

代码在我的本地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.
Run Code Online (Sandbox Code Playgroud)

经过一些阅读后,我怀疑在运行时,正在为validator类读取不正确的类定义.我该如何解决?

更新

事实证明Jboss有自己的实现JAXP,我的代码需要从JDK而不是JBoss中选择JAXP实现.我可以通过传递-jaxpmodule参数来轻松地做到这一点standalone.sh(使用这个,我的代码也选择了正确的JAXP实现) -

java -jar jboss-modules.jar -jaxpmodule "javax.xml.jaxp-provider"
Run Code Online (Sandbox Code Playgroud)

但是我想使用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>
Run Code Online (Sandbox Code Playgroud)

但这不起作用,我该如何解决这个问题呢?

Sak*_*lya 0

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