簡體   English   中英

使用DocumentBuilderFactory將文檔轉換為字符串?

[英]Document to String using DocumentBuilderFactory?

我正在嘗試找到一種將Document轉換為String並將此XML Document轉換為String的方法? 在這里發布。 但是, 由於XXE漏洞 ,我想不使用TransformerFactory進行轉換, 只使用DocumentBuilderFactory 由於其他限制,我無法升級到jdk8。

到目前為止,我還沒有運氣。 所有搜索都返回上面鏈接中所示的相同代碼。

是否有可能做到這一點?

這很難做到,但是由於您的實際問題是安全漏洞而不是TransformerFactory ,所以這可能是更好的方法。

您應該能夠將TransformerFactory配置為忽略實體,以防止此類問題。 請參閱: 防止XXE注入

可能對您的安全性起作用的另一件事是使用TransformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING) 這樣可以避免您擔心的問題。 另請參閱有關Coderanch的此論壇主題。

根據TransformerFactory.getInstance()實際返回的實現,設置FEATURE_SECURE_PROCESSING可能有所幫助,也可能沒有幫助。

例如,在Java 7中,在類路徑上沒有其他XML庫的情況下,設置了transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); 沒有幫助。

您可以通過提供StreamSource以外的Source來解決此問題(該工廠需要使用一些您無法控制的設置來解析)。

例如,您可以像這樣使用StAXSource

TransformerFactory transformerFactory = TransformerFactory.newInstance();
transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); // does not help in Java 7
Transformer transformer = transformerFactory.newTransformer();

// StreamSource is insecure by default:
// Source source = new StreamSource(new StringReader(xxeXml));

// Source configured to be secure:
XMLInputFactory xif = XMLInputFactory.newFactory();
xif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
xif.setProperty(XMLInputFactory.SUPPORT_DTD, false);
XMLEventReader xmlEventReader = xif.createXMLEventReader(new StringReader(xxeXml));
Source source = new StAXSource(xmlEventReader);

transformer.transform(
        source,
        new StreamResult(new ByteArrayOutputStream()));

請注意 ,實際的TrasformerFactory可能實際上並不支持StAXSource ,因此您需要像在生產中那樣使用類路徑來測試代碼。 例如,Saxon 9(我知道是舊的)不支持StAXSource ,而我知道的“修復”它的唯一干凈方法是提供自定義net.sf.saxon.Configuration實例。

暫無
暫無

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

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