【发布时间】:2013-03-03 10:46:11
【问题描述】:
我遇到了问题。我想让它工作,但它没有:
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 获取索引并以这种方式提取列名。我可以做到这一点,但如果可能的话,我宁愿让参数化工作,因为这对我来说似乎更自然。
提前感谢您提供的任何帮助。
【问题讨论】:
-
这根本不被支持。您需要手动构建 SQL 文本,检查以确保列名有效(可能使用
enum).. -
如果这个方法有效,那么参数化查询就变得不安全了。
标签: asp.net sql sqldatasource