SAXParserFactory默认不安全,需显式配置:禁用DOCTYPE声明、关闭外部实体和XInclude、设置解析限制、启用secure-processing特性,方可防御XXE和DoS攻击。

Java的SAXParserFactory默认不启用XML安全防护,直接解析不可信XML可能引发XXE(XML外部实体)攻击、DoS等风险。必须显式配置安全特性才能安全使用。
禁用外部实体解析(关键)
这是防范XXE攻击最核心的设置。需同时禁用DTD和外部实体:
-
setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)—— 禁止DOCTYPE声明(彻底阻断XXE入口) setFeature("http://xml.org/sax/features/external-general-entities", false)setFeature("http://xml.org/sax/features/external-parameter-entities", false)
注意:仅设false不够,某些JDK版本仍可能绕过;推荐优先使用disallow-doctype-decl强制禁止DOCTYPE。
关闭XInclude支持(可选但推荐)
XInclude也可能被利用加载外部资源:
立即学习“Java免费学习笔记(深入)”;
setFeature("http://apache.org/xml/features/xinclude", false)
设置合理的解析限制(防DoS)
防止恶意构造的超大或深度嵌套XML导致内存耗尽或栈溢出:
创想C2C商城系统,系统功能仿照淘宝设计,采用模块标签技术和静态html生成技术 基于Asp.Net/C#+SQL的开发的创想多用户商城系统,具有智能化、高扩展、稳定安全等特性,后台可自由添加频道,自由修改界面风格,商品无限级 分类,支持在线支付整合,通过安装和使用创想C2C商城系统,就可以轻松建立起专业大型的网上交易平台。创想C2C多用户商城系统5.6.3.8版本升级功能1.网站地区设置功能的增
-
setFeature("http://apache.org/xml/features/dom/include-ignorable-whitespace", false)—— 减少空白文本节点开销 - 通过系统属性控制解析器行为(JDK 8u191+):
System.setProperty("jdk.xml.maxOccurLimit", "200");System.setProperty("jdk.xml.maxElementDepth", "50");
这些属性需在创建SAXParserFactory前设置,且对所有后续解析器生效。
使用SecureProcessingFeature增强防护
JDK 7+支持标准安全处理模式:
setFeature("http://javax.xml.XMLConstants/feature/secure-processing", true)
该特性会自动启用多项防护(如限制实体展开、禁止协议处理器加载等),是简洁有效的兜底措施。
基本上就这些。只要禁用DOCTYPE、关闭外部实体、开启secure-processing,再配合合理限制,SAXParserFactory就能安全处理不可信XML输入。









