安全地解析 XML 文档

Parse XML document securely

提问人:rickygrimes 提问时间:3/12/2014 更新时间:11/17/2021 访问量:3414

问:

如何安全地分析 XML 文档,使其不允许外部实体作为传入 XML 文档的一部分?我正在使用 DOM 解析器 -

Document test = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(byteArrayInputStream))
爪哇岛

评论

0赞 Krishna Pandey 11/3/2017
您想阅读这篇 BlackHat 论文,了解您的防御措施如何无法提供与 XXE 攻击相关的安全性。它还提到了@erickson关于FEATURE_SECURE_PROCESSING选项的指向。

答:

5赞 erickson 3/12/2014 #1

您可以通过设置 FEATURE_SECURE_PROCESSING 来请求安全处理;这是否禁止外部实体取决于 的提供者,但它可能是一个候选者。DocumentBuilderFactory

DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
f.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
Document test = f.newDocumentBuilder.parse(...);

评论

1赞 karsten314159 4/5/2017
值得注意的是,您还应该设置 否则您仍然容易受到外部实体攻击:f.setFeature( "http://xml.org/sax/features/external-general-entities", false );org.apache.xerces.impl.XMLEntityManager.startEntity(Unknown Source) calls org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source) calls sun.net.www.protocol.ftp.FtpURLConnection.getInputStream(FtpURLConnection.java:393)
0赞 tobidiahstane 11/17/2021 #2

您需要设置:

DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
f.setFeature("http://xml.org/sax/features/external-general-entities", false); 
f.setFeature("http://xml.org/sax/features/external-parameter-entities", false); 
f.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 
f.setXIncludeAware(false); 
f.setExpandEntityReferences(false);

Document test = f.newDocumentBuilder.parse(...);

避免外部实体扩张。

评论

1赞 Community 11/17/2021
您的答案可以通过其他支持信息进行改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。