如何在Npgsql中使用Update命令避免SQL注入?

时间:2015-06-19 17:35:22

标签: database postgresql sql-injection npgsql

我正在尝试使用Npgsql PostgreSQL客户端完成两件事:

  1. 避免SQL注入,
  2. 管理包含单引号'
  3. 的数据

    我看不出怎么做:(

    PostrgeSQL版本9.1

    在下面的代码中,dx.chronic属于bool类型?表dx的cdesc可能包含单引号,如“Tom's dog”。显然,当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

1 个答案:

答案 0 :(得分:6)

正如@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();
}