0

0

C#如何安全地解析XML以防止XXE攻击 XmlReaderSettings

星降

星降

发布时间:2026-01-11 12:01:35

|

641人浏览过

|

来源于php中文网

原创

必须禁用DTD和外部实体解析以防止XXE攻击:设置DtdProcessing.Prohibit(.NET Core/.NET 5+)或ProhibitDtd=true(.NET Framework),并设XmlResolver=null;同时限制输入长度、深度等,避免使用不安全的Load()方法。

c#如何安全地解析xml以防止xxe攻击 xmlreadersettings

在C#中使用 XmlReader 解析XML时,若未正确配置 XmlReaderSettings,可能遭受XML外部实体(XXE)攻击。关键在于禁用外部实体解析和DTD处理。

禁用 DTD 和外部实体解析

默认情况下,XmlReader 可能加载并解析DTD(文档类型定义)及外部实体(如 ),导致敏感文件读取或SSRF。必须显式关闭这些功能:

  • 设置 ProhibitDtd = true(.NET Framework 4.0+)或 DtdProcessing = DtdProcessing.Prohibit(.NET Core/.NET 5+)
  • 设置 XmlResolver = null,防止解析任何外部URI(包括系统标识符、实体引用)

使用安全的 XmlReaderSettings 示例

以下是最小安全配置(适用于 .NET Core 3.1+ 和 .NET 5+):

var settings = new XmlReaderSettings
{
    DtdProcessing = DtdProcessing.Prohibit,
    XmlResolver = null,
    ValidationType = ValidationType.None // 禁用验证以避免隐式加载schema
};
using var reader = XmlReader.Create(xmlStream, settings);
// 后续调用 Read() 解析

对于 .NET Framework 4.0–4.7.x,改用:

CreBee
CreBee

短视频矩阵运营工具,跨平台多账号一站式管理

下载
var settings = new XmlReaderSettings
{
    ProhibitDtd = true,
    XmlResolver = null,
    ValidationType = ValidationType.None
};

额外加固建议

仅靠禁用DTD还不够,还需注意以下实践:

  • 不信任输入源:即使来自内部系统,也应视为不可信;对XML做长度、深度、节点数限制(可用 MaxCharactersInDocumentMaxCharactersFromEntities
  • 避免使用过时API:不要用 XmlDocument.Load()XDocument.Load() 直接解析不受控XML,它们默认启用DTD且不易安全配置
  • 启用行号与位置信息仅用于调试:生产环境可设 LineNumberOffset = 0LinePositionOffset = 0,但非安全必需项

验证是否生效的小技巧

构造一个含外部实体的测试XML(如 ]>&x;),用上述设置解析——若抛出 XmlException(提示“prohibited”或“DTD is prohibited”),说明防护已起效;若成功加载或静默失败,则配置有误。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

231

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

435

2024.03.01

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1870

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2084

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

973

2024.11.28

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

179

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

277

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

252

2025.06.11

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

78

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
极客学院Java8新特性视频教程
极客学院Java8新特性视频教程

共17课时 | 3.7万人学习

C# 教程
C# 教程

共94课时 | 6.4万人学习

C 教程
C 教程

共75课时 | 4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号