gpt4 book ai didi

java - 使用 Jaxb2Marshaller 防止解析包含 DTD 的 XML 文件

转载 作者:数据小太阳 更新时间:2023-10-29 02:12:13 26 4
gpt4 key购买 nike

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

@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 的情况下出于验证目的需要扩展实体,因此这似乎不是解决方案。

最佳答案

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

在 JAXB RI 中有一个上下文属性 com.sun.xml.bind.disableXmlSecurity这是 reasonably set to false默认。 JAXB 注册机在 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 .

关于java - 使用 Jaxb2Marshaller 防止解析包含 DTD 的 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26649950/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com