如何避免使用构造查询的CA2100

Geo*_*off 5 c# code-analysis

在我的代码中的许多地方,我正在使用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;
Run Code Online (Sandbox Code Playgroud)

Tim*_*ter 6

为什么你要使用一个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;
Run Code Online (Sandbox Code Playgroud)