小编典典

在列名称上使用C#SQL参数化

sql

我有一个问题。我希望它能正常工作,但不能:

SqlDataSource.SelectCommand = "SELECT blah1, blah2 FROM myTable WHERE @ColumnName = @Value";

SqlDataSource.SelectParameters.Add("ColumnName", System.Data.DbType.String, "one");
SqlDataSource.SelectParameters.Add("Value", System.Data.DbType.String, "two");

它不会替代第一个参数“ ColumnName”。如果我删除该参数并将列名这样放置,它将起作用:

SqlDataSource.SelectCommand = "SELECT blah1, blah2 FROM myTable WHERE one = @Value";

SqlDataSource.SelectParameters.Add("Value", System.Data.DbType.String, "two");

我有一个用户界面,用户可以在其中选择要搜索的数据库列名称。我想保护自己免受任何形式的注入式攻击。有什么想法可以使我工作吗?

我读到的一个主意是使用查找表以DropDownList这种方式从中提取索引并提取列名称。我可以做那个工作,但是如果可能的话,我宁愿让参数化工作,因为这对我来说似乎更自然。

预先感谢您提供的任何帮助。


阅读 231

收藏
2021-04-15

共1个答案

小编典典

由于查询参数是 解析SQL和生成执行计划
解析的,因此您实际上无法使用参数动态构建SQL。我建议以安全的方式构建SQL字符串本身。也许首先创建一个enum有效的列名:

enum DbColumns { One, Two, Three };

然后像这样构建SQL字符串:

DbColumns colName = (DbColumns)Enum.Parse(typeof(DbColumns), "One");
SqlDataSource.SelectCommand = String.Format("SELECT blah1, blah1 FROM myTable WHERE {0} = @Value", colName);

另一个想法是使用正则表达式(也许只允许使用)验证列名[a-z]

2021-04-15