Я генерирую некоторый динамический SQL и хотел бы убедиться, что мой код защищен от SQL инъекция.
В качестве аргумента вот минимальный пример того, как он генерируется:
var sql = string.Format("INSERT INTO {0} ({1}) VALUES (@value)",
tableName, columnName);
В приведенном выше примере tableName
, columnName
и все, что привязано к @ value
поступают из ненадежного источника. Поскольку используются заполнители, @value
защищен от атак путем внедрения SQL и может быть проигнорирован. (Команда выполняется через SqlCommand.)
Однако имя_таблицы
и имя_столбца
не могутбыть привязаны в качестве заполнителей и поэтому уязвимыдля атак путем внедрения . Поскольку это «действительно динамичный» сценарий, нет доступного белого списка имя_таблицы
или имя_столбца
.
Таким образом, возникает вопрос:
Существует ли стандартный, встроенныйспособ проверки и/или очистки tableName
и columnName
? (SqlConnection или вспомогательный класс и т. д.) Если нет, то как можно выполнить эту задачу без использования сторонней библиотеки?
Примечания:
[schema].[My Table].column
так же "безопасен", как table1
.Обновление:
Только что нашел это и подумал, что это несколько интересно: в .NET4 (EF4?) есть функция SqlFunctions.QuoteName. Ладно, тут мне особоне помогает...