Как безопасно отбросить таблицу с именем переменной?
Предположим, я хочу удалить таблицу, имя которой является значением переменной, например "#t".
SqlCommand cmd = new SqlCommand( "drop table " + TableName ); //Not safe
SqlCommand cmd = new SqlCommand( "drop table [" + TableName +"]" ); //Not safe
EXEC( 'drop table [' + @tablename +"]" ); --Not safe
Ничто из вышеперечисленного не застраховано от внедрения SQL-кода, так что же является альтернативой?
Люди говорят: "Вы должны использовать динамический SQL", но примеры все еще обычно включают небезопасную конкатенацию, как в третьем примере выше.
Наиболее близкая вещь к ответу, который я могу найти ( /questions/5034602/imya-peremennoj-tablitsyi-s-ispolzovaniem-dinamicheskogo-sql-v-c/5034609#5034609), в основном говорит о том, что вы должны выполнить проверку самостоятельно, и нет никакого способа ее обойти (т.е. убедиться, что переменная действительна посредством ее анализа). или получить его из надежного источника), но я не удовлетворен этим ответом.
1 ответ
QUOTENAME
Функция гарантирует, что ваша переменная рассматривается как "допустимый идентификатор с разделителями SQL Server".
Затем вам решать, будет ли данная таблица удалена. Может быть, с разрешениями SQL для таблицы или белого списка таблиц, которые можно удалить...