Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何避免在Npgsql中使用Update命令进行SQL注入?_Database_Postgresql_Sql Injection_Npgsql - Fatal编程技术网

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

Database 如何避免在Npgsql中使用Update命令进行SQL注入?,database,postgresql,sql-injection,npgsql,Database,Postgresql,Sql Injection,Npgsql,我尝试使用Npgsql PostgreSQL客户端完成两件事: 避免SQL注入,并且 管理包含单个报价的数据 我也不知道该怎么做:( PostSQL 9.1版 在下面的代码中,dx.chronic是bool?类型,表dx的cdesc可能包含单引号,如“Tom's dog”。显然,当Npgsql/PostgreSQL命中单引号时,UpdateCmd(如所写)将失败 string sChronic = (dx.chronic == null) ? "null" : dx.chronic.ToStri

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

  • 避免SQL注入,并且
  • 管理包含单个报价的数据
  • 我也不知道该怎么做:(

    PostSQL 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

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

    参见“准备好的声明”下的内容。手动编写查询字符串极易出错,因此尽可能避免使用字符串连接插入数据。另外,请尝试升级您的Postgres版本,9.4添加了许多值得拥有的新功能。@tadman我仍然不知道如何在单引号作为记录的一部分时使用它,或者这不重要吗?谢谢。Being担心引号是您没有正确转义的标志。最好的方法是准备语句,让数据库驱动程序为您处理转义。