自動完成-SQL注入單引號
阿新 • • 發佈:2018-11-22
在做查詢自動完成(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予以區分。