如何使用构造查询避免CA2100
本文关键字:CA2100 查询 何使用 | 更新日期: 2023-09-27 17:53:29
在我的代码中的许多地方,我使用StringBuilder构建SQL语句,并且在每种情况下都会触发代码分析中的CA2100: Review SQL queries for security vulnerabilities
,因为SQLCommand内容来自StringBuilder而不是文字。
通常这些查询是通过一些流控制(case或if)组合起来的,其中查询的各个部分可能是有条件的。
我的问题是,我应该抑制每一个这些,或者有一个不同的模式构建(有时复杂)查询内联,但避免警告?
触发这个的代码示例:
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.AppendLine("select ");
sb.AppendLine(" Q.QUOTE_TITLE as [@Description] ");
sb.AppendLine("from ");
sb.AppendLine(" QUOTE Q ");
sb.AppendLine("where ");
sb.AppendLine(" Q.QUOTE_ID = @QUOTE_ID ");
sb.AppendLine(" and Q.QUOTE_VERS = @QUOTE_VERS ");
sb.AppendLine("for xml path('Contract') ");
SqlCommand sqlCmd = new SqlCommand(sb.ToString(), MainDBConnection);
sqlCmd.Parameters.Add("@QUOTE_ID", SqlDbType.Int).Value = QuoteID;
sqlCmd.Parameters.Add("@QUOTE_VERS", SqlDbType.SmallInt).Value = QuoteVersion;
为什么要使用StringBuilder
呢?您可以使用字符串字面值,这也更易于阅读:
string sql = @"select Q.QUOTE_TITLE as [@Description]
from QUOTE Q
where Q.QUOTE_ID = @QUOTE_ID
and Q.QUOTE_VERS = @QUOTE_VERS
for xml path('Contract')";
SqlCommand sqlCmd = new SqlCommand(sql, MainDBConnection);
sqlCmd.Parameters.Add("@QUOTE_ID", SqlDbType.Int).Value = QuoteID;
sqlCmd.Parameters.Add("@QUOTE_VERS", SqlDbType.SmallInt).Value = QuoteVersion;