Как экранировать строку в system.data.sqlite?

Я выполняю запрос SQL (system.data.SQLite) следующим образом:

var color = "red";
var command = new SQLiteCommand("SELECT something FROM tabletop WHERE color = '" + color + "'", Connection);
var reader = command.ExecuteReader();

Переменная цвета — это текст, предоставленный пользователем. Как я могу избежать этого текста, чтобы предотвратить внедрение SQL? Или это плохая практика, и я должен выполнить запрос совершенно другим «защищенным» способом?


person Fred    schedule 12.08.2014    source источник
comment
Вы должны использовать синтаксис, показанный в этом вопросе неправильный синтаксис форматирования аргументов"> stackoverflow.com/questions/22015572/   -  person aalku    schedule 12.08.2014


Ответы (2)


Вы должны использовать параметризованные запросы:

var command = new SQLiteCommand("SELECT something FROM tabletop WHERE color = @Color", Connection);
command.Parameters.AddWithValue("Color", color);

Вы также можете передать массив SQLiteParameter в коллекцию command.Parameters следующим образом:

SQLiteParameter[] parameters = { new SQLiteParameter("Color", color), new SQLiteParameter("Size", size) }; // etc.
command.Parameters.AddRange(parameters);
person Alastair Campbell    schedule 12.08.2014
comment
Нужно ли мне иметь command.Parameters.AddWithValue строку для каждой переменной, или есть какой-то способ передать массив или какую-то другую коллекцию? - person Fred; 12.08.2014

Вы делаете это с подготовленными утверждениями:

SQLiteCommand sql = SQLiteDB.CreateCommand();
sql.CommandText = @"INSERT INTO aziende VALUES (@id_azienda, @nome)";

SQLiteParameter lookupValue = new SQLiteParameter("@id_azienda");
SQLiteParameter lookupValue2 = new SQLiteParameter("@nome");

sql.Parameters.Add(lookupValue);
sql.Parameters.Add(lookupValue2);

lookupValue.Value = "Your unsafe user input goes here";
lookupValue2.Value = "Your second unsafe user input goes here";

sql.ExecuteNonQuery();
person Dr. Gianluigi Zane Zanettini    schedule 12.08.2014