Ala*_*yne 3 database postgresql sql-injection npgsql
我正在尝试使用Npgsql PostgreSQL客户端来完成两件事:
我看不出怎么办:(
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";
....... ? ? ? ? ? ? ? ? ? ? ? ? ? ...................
Run Code Online (Sandbox Code Playgroud)
这是怎么做到的?任何帮助都非常感谢.
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();
}
Run Code Online (Sandbox Code Playgroud)