2015-06-19 2 views
2

Я пытаюсь использовать клиент Npgsql PostgreSQL выполнить две вещи:Как избежать SQL-инъекции с помощью команды Update в Npgsql?

  1. Избегайте инъекции SQL, и
  2. Управление данными, содержащие апострофы '

Я не могу видеть, как сделать что-либо :(

PostrgeSQL версия 9.1

В приведенной ниже коде, dx.chronic имеет типа BOOL? и cdesc из тех ble dx может содержать одиночную кавычку, как «собака Тома». Очевидно, UpdateCmd, как написано, не удастся, если Npgsql/PostgreSQL попадет в одиночную кавычку.

string sChronic = (dx.chronic == null) ? "null" : dx.chronic.ToString(); 

string UpdateCmd = "update dx "+ 
      "set chronic = " + sChronic + 
      " where (trim(lower(cdesc)), trim(cicd9)) = "+ 
      " ('"+dx.description.Trim().ToLower()+"','"+dx.icd9.Trim() +"');"; 

using (NpgsqlCommand command = new NpgsqlCommand(UpdateCmd, conn)) 
      { 
       command.Parameters.Add(new NpgsqlParameter("value1", NpgsqlDbType.Text)); 

       command.Parameters[0].Value = "Big Tom's Dog"; 

      ....... ? ? ? ? ? ? ? ? ? ? ? ? ? ................... 

Как это делается? Любая помощь очень ценится.

ТИА

+2

Смотрите их [документы] (https://github.com/npgsql/npgsql/wiki/User-Manual) под «Подготовленные заявления». Вручную составление строк запроса чрезвычайно подвержено ошибкам, поэтому избегайте вставки данных, используя конкатенацию строк, когда это возможно. Кроме того, попробуйте добавить версию Postgres, 9.4 добавляет много новых функций, которые стоит иметь. – tadman

+0

@tadman Я до сих пор не понимаю, как работать с одной цитатой, когда она является частью записи, или это не имеет значения? Благодарю. –

+1

Забота о кавычках - это знак того, что вы не убегаете должным образом. Лучший способ сделать это - ** подготовленные заявления **, где драйвер базы данных справляется с экранированием для вас. – tadman

ответ

5

Как @tadman говорит, что вы никогда не должны использовать конкатенацию, чтобы составить ваш запрос - это источник SQL инъекции. Однако вам не нужно готовить ваше заявление. Использование заполнителей параметров в запросе, что-то вроде должно работать:

string UpdateCmd = "update dx set chronic = @p1 where (trim(lower(cdesc)), trim(cicd9)) = (@p2);"; 

using (NpgsqlCommand command = new NpgsqlCommand(UpdateCmd, conn)) 
{ 
    cmd.Parameters.AddWithValue("p1", "chronic"); 
    cmd.Parameters.AddWithValue("p2", "value"); 
    cmd.ExecuteNonQuery(); 
} 
Смежные вопросы