[英]Is it possible to parameterize table and column names in SQLite queries?
我试图从C#在SQLite中执行参数化查询,并且im使用的方法是使用以下方法创建静态命令:
SQLiteCommand cmd = new SQLiteCommand(
"SELECT [ID]" +
",[email]" +
",[serializedata]" +
",[restrictions]" +
" FROM " + UserTable +
" WHERE @search = @searchparam", SQLConnection);
cmd.Parameters.Add(new SQLiteParameter("@searchparam"));
cmd.Parameters.Add(new SQLiteParameter("@search"));
并这样称呼它:
Command.Parameters["@searchparam"].Value = searchdata;
Command.Parameters["@search"].Value = search;
SQLiteDataAdapter slda = new SQLiteDataAdapter(UserSelectUsernameCommand);
DataSet ds = new DataSet();
slda.Fill(ds);
User[] array = new User[ds.Tables[0].Rows.Count];
int index = 0;
foreach (DataRow row in ds.Tables[0].Rows)
{
array[index] = new User(this, row);
index++;
}
return array;
但是我在“'@search'不是正确的列名”之类的地方出现错误或类似的东西。 如果我使用恒定的列名,并且仅使用数据作为参数,那么它可以工作,但是当我需要按不同的列名进行搜索时,我不想创建10个不同的命令。
这是什么问题?
通常, 无法对诸如列名(或表名)之类的参数进行参数化-并且存在不同的索引这一事实意味着该索引必须在内部采用不同的计划。 因此,您将必须使用串联- 但要小心地将已知的列名列入白名单以防止sql注入:
SQLiteCommand cmd = new SQLiteCommand(@"
SELECT [ID],[email],[serializedata],[restrictions]
FROM " + whiteListedUserTable + @"
WHERE [" + whiteListedColumnName + @"] = @searchparam", SQLConnection);
cmd.Parameters.Add(new SQLiteParameter("@searchparam"));
...
Command.Parameters["@searchparam"].Value = searchdata;
您不能以这种方式使用查询参数-表示列名。 您只能使用它来提供值。
考虑这样的事情:
SQLiteCommand cmd = new SQLiteCommand(
"SELECT [ID]" +
",[email]" +
",[serializedata]" +
",[restrictions]" +
" FROM " + UserTable +
" WHERE [" + search + "] = @searchparam", SQLConnection);
cmd.Parameters.Add(new SQLiteParameter("@searchparam"));
如果您控制此功能的所有输入,并且如果您以外的其他人不能提供该输入,那应该是安全的。 但是,如果search
来自不受信任的第三方,请确保对值进行适当的安全检查。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.