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

Java中设置XML解析器不验证DTD,核心是禁用外部DTD加载和验证功能,防止解析器尝试获取或校验DOCTYPE声明中的外部实体(如SYSTEM或PUBLIC引用),从而避免网络请求、解析失败或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_PROCESSING为true,开启基础防护
不复杂但容易忽略










