如何在 Npgsql 中使用 Update 命令避免 SQL 注入?
How to avoid SQL Injection with Update command in Npgsql?
我正在尝试使用 Npgsql PostgreSQL 客户端来完成两件事:
- 避免SQL注入,
- 管理包含单引号 '
的数据
我也不知道该怎么做:(
PostrgeSQL 版本 9.1
在下面的代码中,dx.chronic 是 bool 类型? table 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();
}
我正在尝试使用 Npgsql PostgreSQL 客户端来完成两件事:
- 避免SQL注入,
- 管理包含单引号 ' 的数据
我也不知道该怎么做:(
PostrgeSQL 版本 9.1
在下面的代码中,dx.chronic 是 bool 类型? table 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();
}