2015-06-19 45 views
2

我試圖使用Npgsql的PostgreSQL客戶端來完成兩件事情:如何避免在Npgsql中使用更新命令進行SQL注入?

  1. 避免SQL注入,並
  2. 管理包含單引號'數據

我看不出怎麼辦任:(

PostrgeSQL版本9.1

在下面的代碼,dx.chronic是bool類型2及Ta的cdesc ble dx可能包含單引號,如「湯姆的狗」。顯然,當Npgsql/PostgreSQL遇到單引號時,寫成的UpdateCmd將會失敗。

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"; 

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

這是如何完成的?任何幫助最受讚賞。

TIA

+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(); 
} 
相關問題