C#怎么从XML中安全地读取数据以避免注入
发布时间 - 2026-01-12 00:00:00 点击率:次XML注入风险可通过安全配置XmlReader/XDocument、禁用DTD与外部实体、避免XPath拼接及不执行用户数据来规避。关键在于不将不可信内容当代码执行,而非法防“XML注入”本身。
用 XmlReader 或 XDocument.Load() 配合验证,不拼接、不反射、不执行动态 XPath,就能基本避开 XML 注入风险。关键不是“防注入”,而是避免把不可信内容当代码执行。
用 XmlReader 流式读取,不解析实体
XmlReader 默认禁用 DTD 和外部实体(.NET Core / .NET 5+ 默认安全),但旧版 .NET Framework 需手动配置:
- 创建
XmlReaderSettings,设Dt
dProcessing = DtdProcessing.Prohibit - 关闭
XmlResolver:设XmlResolver = null - 再用
XmlReader.Create(stream, settings)读取
这样可防止 XXE(XML 外部实体)攻击,也避免实体展开导致的内存/服务端请求问题。
用 XDocument 时禁用 DTD 解析
XDocument.Load() 底层仍走 XmlReader,所以同样要传入安全的 XmlReaderSettings:
- 不要直接写
XDocument.Load(xmlPath) - 改用
XDocument.Load(XmlReader.Create(fileStream, safeSettings)) - 若从字符串加载,用
StringReader包一层再传给XmlReader.Create
别用 XPath 查询未过滤的用户输入
XPath 表达式拼接是常见隐患。例如:$"/root/user[@id='" + userId + "']" —— 这等于把攻击面交给了用户。
- 优先用 LINQ to XML(如
doc.Root.Elements("user").FirstOrDefault(x => x.Attribute("id")?.Value == userId)) - 若必须用 XPath,用
XPathSelectElement(doc, xpath, namespaceManager),且确保xpath是硬编码或白名单枚举值 - 绝不将用户输入直接插进 XPath 字符串
不信任任何属性值和文本节点内容
XML 数据本身不是“代码”,但若你把它当代码用,就出问题。比如:
- 把
node.Attribute("type").Value当作类名去反射加载 —— 可能触发任意类型实例化 - 把
node.Value当作 SQL 片段拼接 —— 引发 SQL 注入 - 把
node.Attribute("url").Value直接用于HttpClient.GetAsync()—— 可能外连恶意地址
这些不是 XML 注入,而是业务逻辑误用。应对方式是:校验 + 白名单 + 转义(如输出到 HTML 时用 WebUtility.HtmlEncode)。
基本上就这些。XML 本身没有“注入漏洞”,危险来自解析器配置不当、XPath 拼接、或把数据当指令执行。关掉 DTD、不用拼接、不反射用户值,就稳了。
# html
# node
# 编码
# stream
# c#
# .net
# sql
# NULL
# xml
# 字符串
# FileStream
# Attribute
# linq
# 不可信
# 加载
# 就能
# 把它
# 给了
# 再用
# 可通过
# 关键在于
# 时用
# 不信任
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Android中AutoCompleteTextView自动提示
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
大型企业网站制作流程,做网站需要注册公司吗?
如何在阿里云高效完成企业建站全流程?
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
用v-html解决Vue.js渲染中html标签不被解析的问题
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
简历没回改:利用AI润色让你的文字更专业
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
javascript基本数据类型及类型检测常用方法小结
如何在宝塔面板创建新站点?
Laravel如何实现多对多模型关联?(Eloquent教程)
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
如何选择可靠的免备案建站服务器?
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
三星、SK海力士获美批准:可向中国出口芯片制造设备
canvas 画布在主流浏览器中的尺寸限制详细介绍
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
Laravel用户密码怎么加密_Laravel Hash门面使用教程
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
利用vue写todolist单页应用
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
公司网站制作价格怎么算,公司办个官网需要多少钱?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
如何在阿里云虚拟主机上快速搭建个人网站?
教你用AI将一段旋律扩展成一首完整的曲子
如何做网站制作流程,*游戏网站怎么搭建?
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
JavaScript如何实现错误处理_try...catch如何捕获异常?
Laravel怎么实现模型属性的自动加密
Android利用动画实现背景逐渐变暗
专业商城网站制作公司有哪些,pi商城官网是哪个?
JavaScript模板引擎Template.js使用详解
活动邀请函制作网站有哪些,活动邀请函文案?
Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】
香港服务器网站推广:SEO优化与外贸独立站搭建策略
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
如何破解联通资金短缺导致的基站建设难题?
Laravel如何处理异常和错误?(Handler示例)
WEB开发之注册页面验证码倒计时代码的实现
实现点击下箭头变上箭头来回切换的两种方法【推荐】
使用豆包 AI 辅助进行简单网页 HTML 结构设计


dProcessing = DtdProcessing.Prohibit