使用DocumentBuilderFactory将文档转换为字符串?

时间:2015-05-01 18:08:49

标签: java xml dom document

我正在尝试找到将Document转换为String的方法,并在此处找到此XML Document to String?帖子。但是,我想要进行转化without using TransformerFactory because of XXE Vulnerabilities并仅使用DocumentBuilderFactory。由于其他限制,我无法升级到jdk8。

到目前为止,我还没有运气;所有搜索都返回上述链接中显示的相同代码。

是否可以这样做?

2 个答案:

答案 0 :(得分:0)

这很难做到,但由于您的实际问题是安全漏洞而非 TransformerFactory ,这可能是更好的方法。< / p>

您应该能够配置TransformerFactory以忽略实体以防止出现此类问题。请参阅:Preventing XXE Injection

可能对您的安全问题有用的另一件事是使用TransformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING)。这应该可以防止您担心的问题。另请参阅this forum thread on coderanch.

答案 1 :(得分:0)

设置FEATURE_SECURE_PROCESSING可能会有所帮助,也可能没有帮助,具体取决于TransformerFactory.getInstance()实际返回的实现。

例如,在Java 7中,类路径设置transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);上没有其他XML库也无济于事。

您可以通过提供除Source之外的StreamSource来解决此问题(工厂需要使用您无法控制的某些设置进行解析)。

例如,您可以像这样使用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并且是唯一一种清除&#34;修复&#34;我知道它是提供自定义net.sf.saxon.Configuration实例。