自動完成 SQL注入單引號

2021-09-01 11:59:32 字數 1805 閱讀 8821

在做查詢自動完成(autocomplete)功能時,出現乙個小bug。如下圖所示:

這個錯誤很明顯是sql語句語法錯誤引起的,我這裡後端用的是字串拼接方式生成sql語句,其中部分條件模糊查詢語句如下:

sql += string.format(@" and (name like '%%' or shortname like '%%' 

or linkman like '%%' or telphone like '%%' or mobile like '%%'

or mainbrand like '%%' or py like '%%'", 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_ or shortname like @word_ or linkman like @word_

or telphone like @word_ or mobile like @word_ or mainbrand like @word_ or py like @word_", i);

parameters.add(new sqlparameter(string.format("@word_", i), string.format("%%", 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予以區分。

SQL注入過濾單引號是否無解

sql注入攻擊能夠得逞,往往是因為前台頁面傳遞的引數含有非法字元,導致sql原有邏輯發生改變。如經典的登入驗證例子 假設資料庫中username admin,password admin123 public static void main string args throws exception ...

繞過單引號繼續注入

web 應用程式一般都會使用資料庫來儲存各種資訊,比如電子商務 的帳戶資訊 銷售商品的 訂單 支付細節 和各種不同的許可權數值等。資料庫中的資訊的讀取 更新 增加或者刪除等都是通過 sql來實現的,因此,在資料互動的環節沒有安全過濾淨化,則可能易於受到 sql注入攻擊,嚴重的可能導致資料庫非法操作,...

網頁是否存在SQL注入 單引號判斷法

id引數左右有數字型 無 單引號 雙引號 括號等方式組成閉合 最為經典的單引號判斷法 在引數後面加上單引號,比如 如果頁面返回錯誤,則存在 sql 注入。原因是無論字元型還是整型都會因為單引號個數不匹配而報錯。通常 sql 注入漏洞分為 2 種型別 數字型 字元型 當輸入的參 x 為整型時,通常 1...