我有一个问题。我希望它能正常工作,但不能:
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这种方式从中提取索引并提取列名称。我可以做那个工作,但是如果可能的话,我宁愿让参数化工作,因为这对我来说似乎更自然。
DropDownList
预先感谢您提供的任何帮助。
由于查询参数是 在 解析SQL和生成执行计划 后 解析的,因此您实际上无法使用参数动态构建SQL。我建议以安全的方式构建SQL字符串本身。也许首先创建一个enum有效的列名:
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]。
[a-z]