Java如何设置XML解析器不验证DTD

9次阅读

java中禁用xml解析器DTD验证需组合设置:关闭验证模式、禁止加载外部DTD、禁用外部实体解析,并启用安全处理特性,以防范XXE攻击。

Java如何设置XML解析器不验证DTD

Java中设置xml解析器不验证DTD,核心是禁用外部DTD加载和验证功能,防止解析器尝试获取或校验DOCTYPE声明中的外部实体(如SYSTEMpublic引用),从而避免网络请求、解析失败或XXE漏洞。

使用DocumentBuilder时禁用DTD验证

通过DocumentBuilderFactory配置关键属性:

  • 设置setValidating(false):关闭整体验证模式(包括DTD)
  • 设置setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false):显式禁止加载外部DTD(Xerces特有,推荐)
  • 设置setFeature("http://xml.org/sax/features/validation", false):禁用SAX验证(对底层解析器生效)
  • 可选:设置setFeature("http://apache.org/xml/features/disallow-doctype-decl", true):直接拒绝含DOCTYPE的文档(更严格,适合安全敏感场景)

使用SAXParser时跳过DTD处理

SAXParserFactory中同样需关闭验证并阻止外部实体:

  • 调用setValidating(false)
  • 启用"http://apache.org/xml/features/nonvalidating/load-external-dtd"false
  • 若使用自定义EntityResolver,可在resolveEntity方法中直接返回空InputSource,拦截所有外部实体请求

使用DOM4J时禁用DTD加载

DOM4J默认可能尝试加载DTD,需主动干预:

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

  • 创建SAXReader后,调用setValidation(false)
  • 调用setFeature("http://xml.org/sax/features/validation", false)
  • 调用setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false)
  • 可设置setEntityResolver(new DefaultEntityResolver()),或传入返回空InputSource的解析器

安全提示:避免XXE风险

仅关闭验证还不够,必须同时禁用外部实体解析,否则仍可能触发XXE攻击。务必组合设置:

  • setFeature("http://xml.org/sax/features/external-general-entities", false)
  • setFeature("http://xml.org/sax/features/external-parameter-entities", false)
  • 对JDK 1.7+,还可设置系统属性javax.xml.XMLConstants.FEATURE_SECURE_PROCESSINGtrue,开启基础防护

不复杂但容易忽略

text=ZqhQzanResources