You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复C#中Checkmarx检测出的HRA_CSHARP_Missing_XML_Validation漏洞?

修复Checkmarx检测到的HRA_CSHARP_Missing_XML_Validation漏洞

问题原因

当前代码直接使用ExecuteXmlReader()返回的未验证XML数据,未对XML的结构、内容合法性进行校验,可能存在XML注入、恶意数据篡改等风险,触发Checkmarx的HRA_CSHARP_Missing_XML_Validation漏洞警告。

修复方案

通过XML Schema(XSD)验证确保存储过程返回的XML符合预期结构,具体步骤如下:


1. 创建匹配XML结构的XSD文件

根据存储过程返回的XML格式,创建states-schema.xsd文件(可放在项目的xslt目录下),定义合法的XML结构:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Product">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="states" maxOccurs="unbounded">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:string">
                <xs:attribute name="state-id" type="xs:int" use="required"/>
                <xs:attribute name="is-assigned" type="xs:string" use="required"/>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

2. 修改代码启用XML验证

通过XmlReaderSettings配置Schema验证,替换原有的XmlReader创建逻辑,确保只有符合XSD的XML才能被处理:

private void GetList(int intTemplate_ID)
{
   StringBuilder sb = new StringBuilder();
   StringWriter sw = new StringWriter(sb);
   string CONTROL_TYPE = "CHECKBOX";
   XsltArgumentList args = new XsltArgumentList();
   args.AddParam("control-type","",CONTROL_TYPE);

   SqlConnection objConnect = new SqlConnection(strDBConnect);
   SqlCommand objCommand = new SqlCommand( "usp_GetStates_xml", objConnect );
   objCommand.CommandType = CommandType.StoredProcedure;
   objCommand.Parameters.Add ( new SqlParameter( "@Template_ID", SqlDbType.Int, 4));
   objCommand.Parameters["@Template_ID"].Value = intTemplate_ID;
   
   objConnect.Open();
   // 配置XML验证设置
   XmlReaderSettings settings = new XmlReaderSettings();
   settings.ValidationType = ValidationType.Schema;
   // 加载XSD Schema
   settings.Schemas.Add(null, Server.MapPath("xslt/states-schema.xsd"));
   // 添加验证事件处理(捕获验证错误并抛出异常)
   settings.ValidationEventHandler += (sender, e) => 
   {
       if (e.Severity == XmlSeverityType.Error)
       {
           throw new Exception($"XML验证失败: {e.Message}");
       }
   };

   // 使用带验证的XmlReader读取数据,using自动管理资源
   using (XmlReader xmlReader = XmlReader.Create(objCommand.ExecuteXmlReader(), settings))
   {
       XPathDocument xmlDoc = new XPathDocument(xmlReader);
       XslTransform xslDoc = new XslTransform();
       xslDoc.Load(Server.MapPath("xslt/liststates.xslt"));
       xslDoc.Transform(xmlDoc, args, sw, null);
       this.pnlTransformation.Visible = true;
       this.divTransformation.InnerHtml = sb.ToString();
   }
   objConnect.Close();
}

3. 关键优化点

  • 用XmlReader.Create()结合XmlReaderSettings启用Schema验证,直接拒绝不符合结构的XML
  • 使用using语句自动管理XmlReader资源,避免手动关闭遗漏
  • 新增验证事件处理,可根据业务需求选择抛出异常、记录日志等错误处理逻辑

内容的提问来源于stack exchange,提问作者TestUser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:40:33