2010-10-30 4 views
1

Я знаю, это не рекомендуется. Возможный риск SQL-инъекции.Передача запроса в качестве параметра

В моем настоящем приложении я создал класс, содержащий многоразовые функции. Одна из таких функций такова:

public static Int32 InsertNewRecord(string myQuery) 
{ 
    ModCon.OpenConnection(); 
    MySqlCommand cmdInsert = new MySqlCommand(myQuery, ModCon.myCN); 
    try 
    { 
     Int32 RecordsAffected = cmdInsert.ExecuteNonQuery(); 
     return RecordsAffected; 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString(), "Error:", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     return 0; 
    } 
    finally 
    { 
     cmdInsert.Dispose(); 
     ModCon.CloseConnection(); 
    }    
} 

Этот класс имеет много таких методов, которые могут быть использованы повторно. Существует метод заполнения DataGridView, где я передаю имя DataGridView и SQL-запрос, чтобы заполнить его.

Мое приложение в настоящее время является автономным приложением Windows. Что может быть профессиональным способом достичь этого без страха перед SQL Injection?

Методы, приведенные выше, относятся к классу и всякий раз, когда мне нужны эти методы, я создаю экземпляр этого класса в другом классе.

+0

Действительно ли передано в 'myQuery' то, что было передано через строку запроса? – Oded

+0

Да точно. Но помните, что в настоящее время это не веб-приложение. – RKh

ответ

1

У вас есть либо два варианта:

  1. Вы можете создавать описание ваших запросов. Вы можете сделать это, создав класс InsertQuery с именем таблицы. С помощью этого вы можете добавить фильтры, где вы, например, создайте класс EqualFilter, который затем можно составить с помощью AndFilter, чтобы получить два равных сравнений;

  2. Если вы считаете, что это очень много работы, это так. Альтернативой является использование структуры ORM, такой как NHibernate или Entity Framework. Это делает все это для вас и многое другое.

0

Возможно, вы захотите исследовать использование регулярного выражения в C#. В Google есть множество ресурсов, которые можно легко узнать. Просто запретите любые подозрительные символы, такие как%, =,?, & ... (что может привести к запросу SQL-запроса), которые передаются параметру myQuery вашего метода. Это должно найти. Может быть, это не профессиональный способ сделать это, но ... я просто говорю. Удачи.

+0

Спасибо за предложение, но скажите мне профессиональный способ. – RKh

1

Не передавайте свои параметры с запросом. Создайте System.Data.SqlClient.SqlCommand и используйте Command.Parameters.Add(... для добавления параметров. Это полностью предотвращает внедрение SQL.