要安全地使用解析器,您必须在您使用的解析器中明确禁用 XXE。下面介绍如何在最常用的 Java XML 解析器中禁用 XXE。
JAXP DocumentBuilderFactory 和 SAXParserFactory
DocumentBuilderFactory 和 SAXParserFactory XML 解析器都可以使用相同的技术进行配置,以保护它们免受 XXE 攻击。
此处仅介绍 DocumentBuilderFactory 示例。
- JAXP DocumentBuilderFactory setFeature 方法允许开发人员
控制哪些特定于实现的 XML 处理器功能是
启用或禁用
。
- 每个 XML 处理器实现都有自己的特性来控制 DTD 和外部实体的处理方式。
对于 DocumentBuilderFactory 的语法高亮代码 sn-p,请单击 here。
对于 SAXParserFactory 的语法高亮代码 sn-p,请单击 here。
这些链接将为您提供如何将 DTD 用于两个解析器的完整详细信息。
Xerces 1 特点:
通过将此功能设置为 false 来不包含外部实体。
不要通过将此功能设置为 false 来包含参数实体。
Xerces 2 特点:
通过将此功能设置为 true 来禁止内联 DTD。
不要通过将此功能设置为 false 来包含外部实体。
不要通过将此功能设置为 false 来包含参数实体。
StAX 和 XMLInputFactory
StAX 解析器(例如 XMLInputFactory)允许设置各种属性和特性。
要保护 Java XMLInputFactory 免受 XXE 攻击,请执行以下操作:
xmlInputFactory.setProperty(XMLInputFactory.SUPPORT_DTD, false); // 这会为该工厂完全禁用 DTD