2014-12-14 5 views
0

Этот вопрос является продолжением к другому я спросил HereКак передать столбцы в качестве параметров в динамическом SQL - C#, SQL Server Compact

У меня есть форма выигрыша, которая имеет галочки в нем. Имена флажков соответствуют именам столбцов таблицы. Я не могу нормализовать таблицы из-за огромных данных, которые уже получены для живого проекта. так что все остается как есть. Я получаю выбранные имена checbox как csv col1, col2, col3, которые позже я объединяю их с строкой sql. (Без SPs, как его sql compact 3.5 sdf dbase). В моем методе GetData() класса DataAccess я формирую строку sql. Но чтобы избежать инъекций sql, можно гарантировать, что прошедшие проверки имена столбцов будут проверены.

// Get Data 
 
// selectedMPs: string csv, generated from the list of selected posts(checkboxes) from the UI, forming the col names in select 
 
public static DataTable GetDataPostsCars(string selectedMPs, DateTime fromDateTime, DateTime toDateTime) 
 
{ 
 
    DataTable dt; 
 
    //string[] cols = selectedMPs.Split(','); //converts to array 
 
    //object[] cols2 = cols;//gets as object array    
 
    //=== using cols or cols 2 in String.Format does not help 
 

 
    // this WORKS, but as i am aware its prone to injections. so how can i validate the "selectedMPs" that those are columns from a list or dictionary or so on? i am not experienced with that. 
 

 
    string sql = string.Format(
 
      "SELECT " + selectedMPs + " " + 
 
      "FROM GdRateFixedPosts " + 
 
      "WHERE MonitorDateTime BETWEEN '" + fromDateTime + "' AND '" + toDateTime + 
 
    using (cmd = new SqlCeCommand(sql,conn)) 
 
    { 
 
    cmd.CommandType = CommandType.Text;    //cmd.Parameters.Add("@toDateTime",DbType.DateTime); 
 
    dt = ExecuteSelectCommand(cmd); 
 
    } 
 
    return dt; 
 
}

это работает, но, как я знаю его склонным к инъекциям. так как я могу проверить «selectedMPs», что это столбцы из списка или словаря или так далее? Я не испытываю этого. Я бы очень признателен вам за вашу помощь. Заранее спасибо.

+0

Любое, пожалуйста? – Nish

ответ

1

Это единственный возможный подход, и нет никакого риска впрыска с SQL Server Compact, поскольку этот механизм базы данных выполняет только один оператор для каждой партии.

+0

Привет, Эрик! не могли бы вы уточнить некоторые справочные ресурсы? Я редактировал свой исходный код с дополнительными 2 параметрами fromDateTime и ToDateTime. не должны ли эти входные параметры проверяться (по имени, типу и т. д. в базе данных) от самого кода C#, если не совсем ненужны? – Nish

+0

для этих дополнительных параметров, используйте параметризованный sql. – ErikEJ

+0

наверняка. имеет смысл. – Nish