这是一个防Sql注入的Asp.net代码吗?

时间:2011-07-05 10:54:31

标签: asp.net parameters sql-injection sqlconnection sqlcommand

问题:我有一个带有文本值的表单,以及一个必须根据文本值的值返回字符串查询的函数。

解决方案:我使用参数创建了一个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;

如果主要问题是好的子问题: 我是否应该将参数设置为radiobutton和dropdownmenu的参数或者它们是否可以防注射?

1 个答案:

答案 0 :(得分:5)

你在这里做的是注射证明,因为你没有注射任何东西。实际上,你的参数甚至没有被使用(因为它的唯一引用是在字符串文字中,所以SQL Parser甚至不会看到你试图使用参数的位置,因为它会将它视为字符串文字。)

您可能希望将该行代码更改为:

sQuery = "select * from xy where x like '%'+@txtNameParameter+'%'";

这将使SQL看起来像这样:

select * from xy where x like '%'+@txtNameParameter+'%'

无论如何,在SQL命令中需要字符串的位置只是字符串连接。

然而,你对此后所做的事情的描述可能会把所有这些都从水中吹走。我无法理解为什么你只想将查询的where子句发送到业务层。

此外,子字符WHERE子句不包含您在参数中放入的数据。因此,您将无法获得返回的好处

return "where x like '%@txtNameParameter%'";

参数值丢失。