【问题标题】:Prevent parsing XML files containing DTD using Jaxb2Marshaller防止使用 Jaxb2Marshaller 解析包含 DTD 的 XML 文件
【发布时间】:2014-12-26 07:32:33
【问题描述】:

我看到了许多使用 XMLInputFactory、SAXParser 和 DocumentBuilderFactory 的解决方案。我们的项目是spring web service,我们唯一要做的就是:

@Bean
public Jaxb2Marshaller unmarshaller() {
   Jaxb2Marshaller unmarshaller = new Jaxb2Marshaller();
   unmarshaller.setContextPath("foo");
   unmarshaller.setProcessExternalEntities(false);
   return unmarshaller;
}    

然后我们将这个编组器和解组器传递给 MarshallingPayloadMethodProcessor。所以我的问题是 Jaxb2Marshaller 是否有一些属性可以阻止 DTD。比如:unmarshaller.setProperty(foo.SUPPORT_DTD, false);

我们有 .xsd 架构,但在 xml bomb 的情况下,需要扩展实体以进行验证,所以这似乎不是解决方案。

【问题讨论】:

标签: java xml spring jaxb


【解决方案1】:

据我从代码中可以看出,这一定是默认行为。

在 JAXB RI 中有一个上下文属性 com.sun.xml.bind.disableXmlSecurity,默认为 reasonably set to false。 JAXB RI 在 creates the parser 时使用此属性。所以,最后 configures 解析器的 FEATURE_SECURE_PROCESSING 功能:

        SAXParserFactory factory = SAXParserFactory.newInstance();
        if (LOGGER.isLoggable(Level.FINE)) {
            LOGGER.log(Level.FINE, "SAXParserFactory instance: {0}", factory);
        }
        factory.setNamespaceAware(true);
        factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, !isXMLSecurityDisabled(disableSecureProcessing));
        return factory;

您也可以使用系统属性javax.xml.accessExternalDTD

另请参阅此答案:

How to disable DTD fetching using JAXB2.0

如果您想让它更加安全,您可以编写和配置自己的entity resolver

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 2017-07-01
    • 2012-05-13
    • 2016-04-23
    • 2010-09-17
    • 2018-07-24
    • 2011-06-12
    相关资源
    最近更新 更多