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

2022-09-03 16:12:51

我正在实现XML验证,以防止XXE(外部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)));

代码在我的本地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.

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

更新

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

java -jar jboss-modules.jar -jaxpmodule "javax.xml.jaxp-provider"

但是我想使用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>

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


答案 1

正如您在更新中提到的,JBoss/Wildfly 确实发布了自己的 JAXP 实现 - Xalan(和 Xerces)。因此,它在为已部署的应用程序生成类路径时使用该实现。您可以在文件中覆盖此行为,如下所示:jboss-deployment-structure.xml

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
    <deployment>            
        <exclusions>            
            <module name="org.apache.xalan" />
            <module name="org.apache.xerces" /> 
        </exclusions>
    </deployment>
</jboss-deployment-structure>

答案 2

而不是尝试从服务器的运行时中删除 JAR。例如,如果您使用Maven进行依赖管理,那么对于pom.xml中的这个特定JAR,您可以只为这个JAR提供“提供”的范围。提供的作用域指示此 JAR 将用于编译时,并在运行时由运行时本身提供。


推荐