Database 如何避免在Npgsql中使用Update命令进行SQL注入?
我尝试使用Npgsql PostgreSQL客户端完成两件事: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
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担心引号是您没有正确转义的标志。最好的方法是准备语句,让数据库驱动程序为您处理转义。