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

时间:2016-08-19 12:03:55

标签: java xml spring jboss jaxp

我正在实现防止XXE(外部XML实体)注入的XML验证。我从OWASP XXE Prevention Cheat Sheet借了一些代码。我的代码看起来像这样 -

        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有自己的JAXP实现,我的代码需要从JDK而不是JBoss中选择JAXP实现。我可以通过在-jaxpmodule中传递standalone.sh参数来轻松完成此操作(使用此代码,我的代码也选择了正确的JAXP实现) -

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>

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

2 个答案:

答案 0 :(得分:0)

正如您在更新中提到的那样,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>

答案 1 :(得分:-1)

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