防止使用Jaxb2Marshaller解析包含DTD的XML文件
问题描述:
我看到了许多使用XMLInputFactory,SAXParser和DocumentBuilderFactory的解决方案。我们的项目是春天的Web服务,我们唯一能做的是:防止使用Jaxb2Marshaller解析包含DTD的XML文件
@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 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
。
也看到这个答案:
如果你想让它更加安全,可以编写和配置自己entity resolver。
部分在这里回答:http://*.com/questions/9909465/how-to-disable-dtd-fetching-using-jaxb2-0 – lexicore 2014-10-30 10:36:40