【发布时间】:2011-07-05 10:54:30
【问题描述】:
问题:我有一个带有文本值的表单,以及一个必须根据文本值的值返回字符串查询的函数。
解决方案:我创建了一个带参数的 SQLCommand 查询,然后将 SQLCommand.CommandText 放入一个字符串,然后将其返回(返回到要处理该查询的业务逻辑)
主要问题:它是 sql 注入证明吗?
代码示例:
sQuery = "select * from xy where x like '%@txtNameParameter%'";
SqlCommand cmd = new SqlCommand(sQuery);
cmd.Parameters.Add("@txtNameParameter", SqlDbType.VarChar);
cmd.Parameters["@txtNameParameter"].Value = txtName.Text;
string query = cmd.CommandText;
return query;
如果主要问题没问题,则子问题: 我应该将单选按钮和下拉菜单的值也放入参数中,还是它们是防注入的?
【问题讨论】:
-
上面的函数(?)只返回命令文本而命令对象本身就被废弃了?为什么不返回命令对象?
-
因为我只需要返回查询的where子句。所以我在返回它之前所做的就是将它删除选择部分。这是因为字符串查询将被发送到已经具有选择部分的业务逻辑,并将带有 where 子句的字符串作为输入,我必须在这里进行注入证明。
-
最好将控件的值发送到业务层,业务层进而可以决定如何驱动数据访问。它可以将值放入它可以实际使用的 SQL 命令中,而不是传递可能(并且很快)失控的 T-SQL Snippets
-
我知道,我会这样做,但我无法控制数据访问,我必须处理这种情况。我返回的查询安全吗?
-
我同意@Colin Mackay - 如果数据层允许您在其中传递任意 WHERE 子句,那是非常不寻常的。如果是这种情况,那么您可能不得不采用老式的方法,例如转义撇号和其他任何必要的方法。您可能还想与确实控制 DAL 的人交谈,并询问他们您打算如何正确处理此问题...
标签: asp.net parameters sql-injection sqlconnection sqlcommand