2015-06-19 27 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(); 
} 
相关问题