Как бороться с этим предупреждением о внедрении SQL (CA2100)

Ниже приведен код, который я получил со страницы Microsoft: SqlCommand

public static Int32 ExecuteNonQuery(String connectionString, String commandText, CommandType commandType, params SqlParameter[] parameters)
{
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            using (SqlCommand cmd = new SqlCommand(commandText, conn))
            {
                // There're three command types: StoredProcedure, Text, TableDirect. The TableDirect 
                // type is only for OLE DB.  
                cmd.CommandType = commandType;
                cmd.Parameters.AddRange(parameters);

                conn.Open();
                return cmd.ExecuteNonQuery();
            }
        }
}

Тем не менее, анализ кода VS по-прежнему жалуется на "CA2100":

Предупреждение CA2100 Строка запроса, переданная в SqlCommand.SqlCommand(string, SqlConnection) в FlexClaimFormRepository.ExecuteNonQuery(string, string, CommandType, params SqlParameter[])', может содержать следующие переменные "commandText". Если любая из этих переменных может быть получена из пользовательского ввода, рассмотрите возможность использования хранимой процедуры или параметризованного SQL-запроса вместо построения запроса с конкатенацией строк.

Я знаю точную причину, почему есть предупреждение, но кто-нибудь о том, как от него избавиться? Заданный параметр commandText внутри функции недопустим, поскольку я хочу, чтобы он был параметром.

0 ответов

Я знаю, что это старый вопрос, но, возможно, это поможет кому-то с той же проблемой. Я также использовал хранимую процедуру и поэтому подавил предупреждение, используя информацию из этой статьи от Microsoft:https://docs.microsoft.com/en-us/visualstudio/code-quality/in-source-suppression-overview?view=vs-2019.

Вот атрибут, который я добавил в свой метод:

[System.Diagnostics.CodeAnalysis.SuppressMessage("Security", "CA2100:Review SQL queries for security vulnerabilities", Justification = "Method already uses a Stored Procedure")]

Попробуйте изменить CommandText быть string вместо того String.

У меня была такая же проблема, когда я пытался использовать

new SqlCommand($"Select {1}", sqlConnection) // CA2100 warning

Но когда я изменил его на прямую строку, это сработало

new SqlCommand("Select 1", sqlConnection) // no warning

Другие вопросы по тегам