Очистить имя таблицы/столбца в Dynamic SQL в .NET? (Предотвращение атак с внедрением SQL)

Я генерирую некоторый динамический SQL и хотел бы убедиться, что мой код защищен от SQL инъекция.

В качестве аргумента вот минимальный пример того, как он генерируется:

var sql = string.Format("INSERT INTO {0} ({1}) VALUES (@value)",
    tableName, columnName);

В приведенном выше примере tableName, columnNameи все, что привязано к @ valueпоступают из ненадежного источника. Поскольку используются заполнители, @valueзащищен от атак путем внедрения SQL и может быть проигнорирован. (Команда выполняется через SqlCommand.)

Однако имя_таблицыи имя_столбцане могутбыть привязаны в качестве заполнителей и поэтому уязвимыдля атак путем внедрения . Поскольку это «действительно динамичный» сценарий, нет доступного белого списка имя_таблицыили имя_столбца.

Таким образом, возникает вопрос:

Существует ли стандартный, встроенныйспособ проверки и/или очистки tableNameи columnName? (SqlConnection или вспомогательный класс и т. д.) Если нет, то как можно выполнить эту задачу без использования сторонней библиотеки?

Примечания:

  • Все идентификаторы SQL, включая схему, должны быть приняты: например. [schema].[My Table].columnтак же "безопасен", как table1.
  • Может либо очиститьидентификаторы, либо обнаружитьнедопустимый идентификатор. (Нет необходимости гарантировать, что таблица/столбец действительно действительна в контексте; результирующий SQL может быть недопустимым, но должен быть «безопасным».)

Обновление:

Только что нашел это и подумал, что это несколько интересно: в .NET4 (EF4?) есть функция SqlFunctions.QuoteName. Ладно, тут мне особоне помогает...

11
задан 19 March 2012 в 21:53
поделиться