首页/安全/漏洞与攻击面速查/禁用 XML 外部实体配置示例
Web 漏洞原理与防护55 条

禁用 XML 外部实体配置示例

各语言解析器都提供禁用 DTD 与外部实体的开关:Java 设 disallow-doctype-decl,Python 用 defusedxml 等安全包装,PHP 需注意 libxml 版本与加载选项。

漏洞与攻击面速查安全更新于 2026-10-12

Java(DocumentBuilderFactory)

Java(DocumentBuilderFactory)
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
dbf.setXIncludeAware(false);
dbf.setExpandEntityReferences(false);

Python(defusedxml)

Python(defusedxml)
from defusedxml.ElementTree import parse
tree = parse('upload.xml')   # 默认禁用 DTD 与实体解析

PHP

PHP
// PHP 8 / libxml 2.9+ 默认不加载外部实体
// 避免传入 LIBXML_NOENT(该选项会开启实体替换)
// libxml_disable_entity_loader 自 PHP 8.0 起已废弃,无需再调用
建议统一封装安全解析工厂,禁止业务代码直接实例化解析器。

易错点

  • 只检查一个解析器:SOAP 客户端与其他 XML 库(如 XStream)仍需逐一核查
  • PHP 场景传入 LIBXML_NOENT 会主动开启实体替换,属于要避免的配置

数据来源与参考

  • OWASP XXE Prevention Cheat Sheet
  • defusedxml 项目文档
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌