На данный момент у меня есть рабочий кусок кода, который выглядит примерно так:
string sqlCreateDBQuery = " CREATE DATABASE "
+ "["+databaseName+"]"
+ " ON PRIMARY "
+ " (NAME = Data, "
+ " FILENAME = '" + strDataPath + databaseName + ".mdf', "
+ " FILEGROWTH = 1MB) "
+ " LOG ON (NAME = Log, "
+ " FILENAME = '" + strLogPath + databaseName + "_log.ldf', "
+ " FILEGROWTH = 10%) "
+ " COLLATE Latin1_General_CI_AS ;";
SqlCommand command = new SqlCommand(sqlCreateDBQuery, connection);
Это, с моим нынешним пониманием, потенциальная проблема SQL -инъекционных атак и хорошо , ошибки пользовательского ввода.
Итак, мой вопрос: как мне безопасно создать базу данных программно на SQL сервере, где пользователь может назвать базу данных?
Я знаю, что следует использовать параметризованные SQL -запросы, чтобы избежать SQL -инъекций, но по какой-то причине я не могу понять, как это сделать для создания новой базы данных или пользователей / логинов.
Я также читал, что есть возможность использовать SQL API объекта управления сервером, как описано в этом ответе здесь: Создание базы данных программно в SQL Сервер
К сожалению, это не вариант для нас.
На данный момент я не понял, как использовать параметризованный запрос для этой задачи. Вот как я мог бы предположить, как должен выглядеть Код для достижения этой цели, но без рабочего результата.
SqlCommand command = connection.CreateCommand();
command.CommandText = " CREATE DATABASE "
+ "@dbName"
+ " ON PRIMARY "
+ " (NAME = Data, "
+ " FILENAME = @dataPath, "
+ " FILEGROWTH = 1MB) "
+ " LOG ON (NAME = Log, "
+ " FILENAME = @logPath, "
+ " FILEGROWTH = 10%) "
+ " COLLATE Latin1_General_CI_AS ;";
command.Parameters.AddWithValue("@dbName", StrDBName);
command.Parameters.AddWithValue("@dataPath", $"{strDataPath}{StrDBName}.mdf");
command.Parameters.AddWithValue("@logPath", $"{strLogPath}{StrDBName}_log.ldf");
Я также прочитал Здесь , что это должно быть возможно при использовании c SQL, но, к сожалению, все мои попытки либо заканчивались ошибками синтаксиса, либо параметрами не заменялись фактическими значениями.
Я что-то здесь упускаю или это просто не так тривиально, как я изначально думал