1. 程式人生 > >自動完成-SQL注入單引號

自動完成-SQL注入單引號

在做查詢自動完成(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予以區分。