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