C# Sonarqube表示违反csharpsquid:S3649-在SQL语句中使用之前,应先清除用户提供的值

C# Sonarqube表示违反csharpsquid:S3649-在SQL语句中使用之前,应先清除用户提供的值,c#,sonarqube,C#,Sonarqube,在对代码的sonarqube扫描中,我发现了一些违反csharpsquid:S3649的情况——在SQL语句中使用之前,应该对用户提供的值进行清理。我认为我的代码是兼容的,其他人能解释为什么这被标记为不兼容吗 string connectionString = DatabaseContext.GetiXDataConnectionString(); string sql = "SELECT UserID FROM SystemUsers " + "Where Wind

在对代码的sonarqube扫描中,我发现了一些违反csharpsquid:S3649的情况——在SQL语句中使用之前,应该对用户提供的值进行清理。我认为我的代码是兼容的,其他人能解释为什么这被标记为不兼容吗

string connectionString = DatabaseContext.GetiXDataConnectionString();

string sql = "SELECT UserID FROM SystemUsers " +
             "Where WindowsLogonName = @WindowsLogon and DomainName = @WindowsDomain and " +
              "[Disabled] = 0";

using (SqlConnection conn = new SqlConnection(connectionString))
{
 conn.Open();

 using (SqlCommand cmd = new SqlCommand(sql, conn))
 {
  cmd.Parameters.Add(new SqlParameter("@WindowsLogon", windowsUsername));
  cmd.Parameters.Add(new SqlParameter("@WindowsDomain", userDomain));
  object queryResult = cmd.ExecuteScalar();

  if (queryResult != null)
     return queryResult.ToString();
  }
}
它会抱怨,因为sql变量不是常量。如果将代码更改为通常不是坏事的代码,则问题将消失:

常量字符串sql=…+…+。。。;

S3649是一个非常简单的规则,当执行的SQL不是常量字符串时会引发该规则。这远不是一个真正的污染分析检查,但它可以捕捉到最简单和最明显的错误