自动完成-SQL注入单引号

11 篇文章 0 订阅
2 篇文章 0 订阅

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

                       

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

这个错误很明显是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<SqlParameter>();
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”数组,那么在数据库服务器会将参数与值对号入座。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值