C#怎么从XML中安全地读取数据以避免注入

发布时间 - 2026-01-12 00:00:00    点击率:
XML注入风险可通过安全配置XmlReader/XDocument、禁用DTD与外部实体、避免XPath拼接及不执行用户数据来规避。关键在于不将不可信内容当代码执行,而非法防“XML注入”本身。

XmlReaderXDocument.Load() 配合验证,不拼接、不反射、不执行动态 XPath,就能基本避开 XML 注入风险。关键不是“防注入”,而是避免把不可信内容当代码执行。

用 XmlReader 流式读取,不解析实体

XmlReader 默认禁用 DTD 和外部实体(.NET Core / .NET 5+ 默认安全),但旧版 .NET Framework 需手动配置:

  • 创建 XmlReaderSettings,设 DtdProcessing = 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 结构设计