Как бороться с этим предупреждением о внедрении 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