自动完成-SQL注入单引号

在做查询自动完成(Autocomplete)功能时,出现一个小bug。如下图所示:

                       

 用微软拼音键入时,会有单引号将拼音间隔开(搜狗不会),当触发前端自动完成代码块时,会调用后台的查询语句,然而......下一秒报错:

自动完成-SQL注入单引号_第1张图片

这个错误很明显是sql语句语法错误引起的,我这里后端用的是字符串拼接方式生成sql语句,其中部分条件模糊查询语句如下:

sql += string.Format(@" and (Name like '%{0}%' or ShortName like '%{0}%' 
or LinkMan like '%{0}%' or TelPhone like '%{0}%' or Mobile like '%{0}%' 
or MainBrand like '%{0}%' or PY like '%{0}%'", key);

对应的sql语句: 

and Name like '%shang'hai%' or ShortName like '%shang'hai%' or LinkMan like '%shang'hai%' 
or TelPhone like '%shang'hai%' or Mobile like '%shang'hai%' or MainBrand like '%shang'hai%' 
or PY like '%shang'hai%')

 这里就是问题的灶点,当调用SqlQuery()时,数据库服务器肯定是报错的。


 下面是该bug解决方案:

利用SqlParameter类,将待查询关键字在sql语句中参数化,以避免单引号sql注入。

var i = 0;
var parameters = new List();
sql += string.Format(@" and (Name like @word_{0} or ShortName like @word_{0} or LinkMan like @word_{0}
or TelPhone like @word_{0} or Mobile like @word_{0} or MainBrand like @word_{0} or PY like @word_{0}", i);
parameters.Add(new SqlParameter(string.Format("@word_{0}", i), string.Format("%{0}%", key)));

对应的sql语句:

AND
      (
          Name LIKE @word_0
          OR ShortName LIKE @word_0
          OR LinkMan LIKE @word_0
          OR TelPhone LIKE @word_0
          OR Mobile LIKE @word_0
          OR MainBrand LIKE @word_0
          OR PY LIKE @word_0
      )

关于“@word_0”取值,其实它存在了parameters 中。因此,调用SqlQuery()时要传两个参数,一个“sql”,一个“parameters”数组,那么在数据库服务器会将参数与值对号入座。

自动完成-SQL注入单引号_第2张图片

PS:如果是多关键字查询,可以遍历它们,然后用i变量每次自增1予以区分。

你可能感兴趣的:(C#,MVC,C#/SQL性能优化)