[英]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
。
另見這個答案:
如果您想讓它更安全,您可以編寫和配置自己的實體解析器 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.