【问题标题】:Java and Xerces: can't find property XMLConstants.ACCESS_EXTERNAL_DTDJava 和 Xerces:找不到属性 XMLConstants.ACCESS_EXTERNAL_DTD
【发布时间】:2019-04-17 08:45:36
【问题描述】:

我在这个博客上寻找了类似的帖子,但找不到我的问题的答案,所以我决定寻求帮助。

我用 Java 写了这个简单的函数:

 public void open(InputStream stream) throws FoliumFatalException {
        try {
            InputSource is = new InputSource(stream);
            DocumentBuilderFactory dfact = DocumentBuilderFactory.newInstance();

//            /* OWASP: inhibit access to External Entities */
            dfact.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); 
            dfact.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); 

            _doc = dfact.newDocumentBuilder().parse(is);

        } catch (Throwable t) {
            _logger.error(t, t);
            throw new FoliumFatalException("ENG-0017", "Errore di parsing su stream", t);
        }

    }

我的目标是应用公开的 OWASP 标准 here,但我收到以下错误:

 java.lang.IllegalArgumentException: Property 'http://javax.xml.XMLConstants/property/accessExternalDTD' is not recognized.
java.lang.IllegalArgumentException: Property 'http://javax.xml.XMLConstants/property/accessExternalDTD' is not recognized.
    at org.apache.xerces.jaxp.DocumentBuilderFactoryImpl.setAttribute(Unknown Source) ~[xercesImpl-2.8.0.jar:?]
    at agora.folium.engine.impl.j2ee.FoliumJ2eeXmlParserImpl.open(FoliumJ2eeXmlParserImpl.java:108) [classes/:?]
    at agora.folium.engine.impl.FoliumAbstractEngine.loadServices(FoliumAbstractEngine.java:268) [classes/:?]
    at agora.folium.engine.impl.j2ee.FoliumJ2eeEngineImpl.startup(FoliumJ2eeEngineImpl.java:110) [classes/:?]
    at agora.folium.engine.Folium.startup(Folium.java:258) [classes/:?]
    at agora.folium.control.impl.j2ee.FoliumActionServlet.init(FoliumActionServlet.java:94) [classes/:?]
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1230) [catalina.jar:7.0.85]
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1174) [catalina.jar:7.0.85]
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1066) [catalina.jar:7.0.85]
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5370) [catalina.jar:7.0.85]
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5668) [catalina.jar:7.0.85]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) [catalina.jar:7.0.85]
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1015) [catalina.jar:7.0.85]
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:991) [catalina.jar:7.0.85]
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652) [catalina.jar:7.0.85]
    at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:712) [catalina.jar:7.0.85]
    at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:2002) [catalina.jar:7.0.85]
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_141]
    at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_141]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [?:1.8.0_141]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [?:1.8.0_141]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_141]

我正在使用 Eclipse Oxygen、Tomcat 7 和 Java 1.8。 谁能帮帮我?

感谢您的支持。

【问题讨论】:

  • xercesImpl-2.8.0.jar:??您的网络应用中是否有 Xerces 的副本?
  • 是的,我有。我什至尝试在 Eclipse 构建路径部分更改优先级,在 JRE 系统库之前使用 XercesImpl。
  • 这可能适用于常规 Java 应用程序,但 Tomcat 必须从您的 Web 应用程序的 jar 中加载类。这样的伎俩是行不通的。
  • 您可以查看post中提供的答案

标签: java eclipse tomcat xerces


【解决方案1】:

我们的 Java 项目是使用 Maven 构建的。当团队决定将SonarQube 集成到管道中时,我们面临着类似的情况。 “SonarQube 不运行您的测试或生成报告。它只导入预先生成的报告”(更多关于 here)。对于 Java/Kotlin/Scala/JVM,SonarQube 需要一些“JaCoCo XML 覆盖率报告”。因此,我们必须在 pom.xml 中添加一个依赖项:

<dependency>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>${jacoco.version}</version>
</dependency>

经过一些调整后,我们已全部启动并运行。但是某些测试因“java.lang.IllegalArgumentException:无法识别属性'http://javax.xml.XMLConstants/property/accessExternalDTD'而失败。 在 org.apache.xerces.jaxp.DocumentBuilderFactoryImpl.setAttribute(Unknown Source)..."。

长话短说,解决方案是将 xerces 排除在外,正如其他答案中所述:

<dependency>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>${jacoco.version}</version>
  <exclusions>
    <exclusion>
      <groupId>xerces</groupId>
      <artifactId>xercesImpl</artifactId>
    </exclusion>
  </exclusions>
</dependency>

【讨论】:

    【解决方案2】:

    问题是由于类路径中的 Xerces/XercesImpl 引起的。 Xerces 不提供对 ACCESS_EXTERNAL_DTD 属性的支持。

    解决方案 1. 如果可能,从类路径中删除 xerces jar。

    解决方案2.使用JDK默认实现

    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance("com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl", null);

    【讨论】:

      【解决方案3】:

      javax.xml.XMLConstants.ACCESS_EXTERNAL_DTD 在JAXP 1.5 中定义,但 Xerces 不支持它。如果您无法删除 Xerces 依赖项,则应在 Xerces 之前将另一个实现添加到您的类路径。

      另外,由于 JDK 包含 Xerces 的实现,您可以 configure DocumentBuilderFactory 使用 System.properties 返回 JDK 版本。

      System.setProperty("javax.xml.parsers.DocumentBuilderFactory",
              "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
      

      【讨论】:

      【解决方案4】:

      Apache Xerces-J 2.12.0 和更早版本实现了不支持您尝试设置的任一属性的旧版本的 JAXP。要阻止对外部实体的访问,您可以编写一个 EntityResolver(始终抛出 SAXException)并将该 EntityResolver 注册到 DocumentBuilder。请参阅此处的文档 [1]。

      [1]http://xerces.apache.org/xerces2-j/javadocs/api/javax/xml/parsers/DocumentBuilder.html#setEntityResolver(org.xml.sax.EntityResolver)

      【讨论】:

        猜你喜欢
        • 2020-05-28
        • 1970-01-01
        • 2018-01-04
        • 2014-07-29
        • 1970-01-01
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        • 2018-05-06
        相关资源
        最近更新 更多