我正在实现防止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>
但这不起作用,我该如何解决这个问题?
答案 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将用于编译时,并且在运行时它将由运行时本身提供。