如何修复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
相关产品推荐
相关产品推荐

