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

我看到了很多使用XMLInputFactory,SAXParser和DocumentBuilderFactory的解决方案.我们的项目是春季网络服务,我们唯一做的是:

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

然后我们将这个marshaller和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.

另见这个答案:

07006

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

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念