[英]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.