2014-10-30 92 views
4

我看到了許多使用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的情況下,爲驗證目的需要擴展實體,所以看起來這不是解決方案。

+0

部分在這裏回答:http://stackoverflow.com/questions/9909465/how-to-disable-dtd-fetching-using-jaxb2-0 – lexicore 2014-10-30 10:36:40

回答

0

據我可以看到從代碼,這必須是默認行爲。

在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