繁体   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