问题:我有一个带有文本值的表单,以及一个必须根据文本值的值返回字符串查询的函数。
解决方案:我使用参数创建了一个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的参数或者它们是否可以防注射?
答案 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%'";
参数值丢失。