我看到了很多使用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.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。