在最近的工作中,由于历史遗留,一个分页查询没有参数化,被查出来有sql注入危险,所以对这个查询进行了参数化修改。
一看不知道,看了吓一跳,可能由于种种原因,分页查询sql是在存储过程中拼接出来的,where之后的条件也是在代码中先进行拼接,然后作为整体参数在传入存储过程里,在存入过程里又进行一次拼接。这样的话就有sql注入的潜在危险,尽管在拼接where之前进行的查询条件的验证。
大家都明白,参数化是防止sql注入的有效方法,然后就对这个分页查询进行大刀阔斧的改革。
思路一:1、对原先的代码中拼接的where条件,不进行直接的赋值拼接。而是拼接成带@符号的参数。并且给参数赋值;例如:
if (Num > 0)
{
sbWhere.Append("AND s.SysNo=").Append(Num.Value);
}
改if (Num > 0)
{
sbWhere.Append("AND s.SysNo = @SysNo");
paras.Add(new MySqlParameter("@SysNo", Num.Value));
}
2、给存储过程添加参数
3、用SetParameters(paras.ToArray())方法直接把参数paras传给存储过程
结论:根本走不通,因为我们的查询条件是动态拼接的,没办法动态给存储过程定义传入参数,这个思路直接给pass掉了;
小结ÿ