Java怎么避免XXE攻击 DocumentBuilderFactory安全配置

3次阅读

java防 XXE 攻击关键在于禁用 DOCTYPE 声明、禁用外部实体展开、禁用外部参数实体,需显式配置 DocumentBuilderFactory 等解析器相关安全特性并统 一加 固。

Java 怎么避免 XXE 攻击 DocumentBuilderFactory 安全配置

Java 中避免 XXE(xml External Entity)攻击的关键,是正确配置 DocumentBuilderFactory,禁用外部实体解析和 DTD 处理。默认配置下,它可能加载远程或本地敏感文件,导致信息泄露、SSRF 甚至 RCE。

禁用外部实体和 DTD 解析

这是最核心的安全配置。必须显式关闭 setExpandEntityReferences(false)setFeature("http://apache.org/xml/features/disallow-doctype-decl", true),否则即使没写 DOCTYPE 也可能被绕过。

  • 禁用 DOCTYPE 声明:调用 factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)
  • 禁止展开外部实体:调用 factory.setExpandEntityReferences(false)
  • 禁用加载外部 DTD:补充设置 factory.setFeature("http://xml.org/sax/features/external-general-entities", false)factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false)

使用安全的默认工厂实例

不要直接 new DocumentBuilderFactory(),优先用 DocumentBuilderFactory.newinstance("com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl", NULL) 或确保 JDK 版本较新(8u121+、11.0.2+),它们默认启用了部分防护,但仍需手动加固上述特性。

更稳妥的方式是 封装 一个 工具 方法,统一返回已加固的 factory 实例,避免每个地方重复漏配。

立即学习Java 免费学习笔记(深入)”;

配合 XMLInputFactory 等其他解析器一并防护

如果项目还用到 SAXParserFactoryXMLInputFactory(如 StAX)或 Unmarshaller(JAXB),同样需要做对应禁用:

  • SAXParserFactory:设置相同 features + setValidating(false)
  • XMLInputFactory:调用 factory.setProperty(XMLInputFactory.SUPPORT_DTD, false)factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false)
  • JAXB:通过 Unmarshaller.setEventHandler(……) 过滤异常,或改用 JAXBContext.createUnmarshaller() 后立即配置底层解析器

考虑替代方案:避免直接解析不可信 XML

若业务允许,优先用 jsON 替代 XML;若必须处理外部 XML,可先用白名单正则或轻量级校验器预筛内容,再交由加固后的dom 解析。对已知结构的 XML,也可用 XSD 校验 +严格模式 进一步约束。

不复杂但容易忽略——关键就三步:禁 DOCTYPE、禁实体展开、禁外部参数。配齐了,XXE 基本防住。

站长
版权声明:本站原创文章,由 站长 2025-12-19发表,共计1502字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
1a44ec70fbfb7ca70432d56d3e5ef742
text=ZqhQzanResources