簡體   English   中英

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

[英]Prevent parsing XML files containing DTD using Jaxb2Marshaller

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

從代碼中我可以看出,這必須是默認行為。

在JAXB RI中,有一個上下文屬性com.sun.xml.bind.disableXmlSecurity ,默認情況下合理地設置為false JAXB RI在創建解析器時使用此屬性。 因此,最后它配置解析器的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

另見這個答案:

如何使用JAXB2.0禁用DTD獲取

如果您想讓它更安全,您可以編寫和配置自己的實體解析器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM