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