批量in查詢中可能會導致的sql注入問題,sql注入

來源:互聯網
上載者:User

批量in查詢中可能會導致的sql注入問題,sql注入

有時間我們在使用in或者or進行查詢時,為了加快速度,可能會經常這樣來使用sql之間的拼接,然後直接匯入到一個in中,這種查詢實際上效能上還是可以的,

例如如下:

update keyword set stats=? where taskid in ('"+CollUtil.toString(list, "','")+"') "
當然這個in裡麵包含的是一些列的資料()但是如果這些資料中包含一些sql比較敏感的關鍵詞或者符號就會出現sql注入,例如如果in查詢中出現一個關鍵詞為(百度'  )這個單引號在sql中就是比較敏感的字元,這就會導致你的這條語句執行失敗。如果我們在寫代碼時如果不注意這些問題,就會引起一些駭客們的攻擊,例如:如果某個駭客搞個語句,裡面含有MySQL識別的注釋符號,然後駭客通過拼接好後 直接執行一個delete操作,那麼你的資料庫系統就這樣完蛋了。


實際上面對這些問題,我們最好不要通過自己排除的方式來,因為很可能出現我們意想不到的情況出現,所以我們在進行無論查詢或者更改插入之類的操作時,最好使用問號運算式,這樣能夠防注入。


但是如果有些特殊情況下,我們的系統使我們內部使用,我們也可以是適當的使用in或者or查詢,但是我們在in()這個括弧裡面要注意數量問題,這個問題因不同的版本in中包含的量估計都是不一樣的。我們最好可以通過一些演算法來控制這個量,最好是自己做一下壓力測試,看看到底你的in中能夠包含多大的資料量,當然我曾經做過壓力測試,in裡面可以包含16W多,當時我是包含了64個字長的英語字母和漢字,在進行操作時,可能會因為欄位的長度不同,速度肯定都會不同。

 int size = ids.size();          int loopNum = (size%1000==0)?(size/1000):(size/1000 + 1);          if(size==0){              return;          }          for(int cp=1;cp<=loopNum;cp++){              int beginRecord = (cp - 1) * 1000;              int endRecord = cp*1000;              if(endRecord >= size){                  endRecord = size;              }              // 分批進行任務擷取              List<String> list = ids.subList(beginRecord, endRecord);  

當然我這隻是一個分組演算法的執行個體,我們平常在使用這種效能不是太好的查詢是也要注意分組進行,如果不這樣,MySQL可能會報一些packet過大的異常或者請檢查你的版本異常,如果你發現你的sql語句沒有問題,這時你就該應該注意到這個問題了。


還有一點,我們在一個函數中進行寫sql語句時,如果一條sql能夠搞定,我們也盡量不要使用第二條,因為資料庫的開啟與關閉是非常耗時的操作,所以我們在使用程式設計語言進行寫程式時,要盡量使用我們工具類中給我們提供的一些類,例如:

  StringBuffer buffer = new StringBuffer();              buffer.append("update keyword set stats=? ");              paramsList.add(stats);              if(stats==Stats.pend.getCode()){                  buffer.append(",pend=? ");                  paramsList.add(new Date());              }              buffer.append("  where taskid in ('"+CollectionUtil.toString(list, "','")+"') ");
這樣如果在滿足2條sql語句的情況下,實際上1條sql就直接搞定了。這樣還能夠增加代碼執行的速度。特別是資料量特別大的情況下,更要減少一個函數中的sql語句,盡量使用拼接,減少資料庫的開啟與關閉。


實現模糊查詢並可以防止sql注入的方法有什,急救

//定義變數
String txt_editor=ultraTextEditor4.Text;
StringBuilder str_where = new StringBuilder();
str_where.Append(" AND ");
str_where.Append(SqlFactory .CreateWhereExpression (CtbClass1.IC_ORG_NAME ,WhereExpression.LIKE,"'%"+ @txt_editor +"%'").BuildSql());
 
SQL注入問題

通用的asp防注入程式.杜絕SQL注入隱患.提升網站安全

一般的http請求不外乎 get 和 post,所以只要我們在檔案中過濾所有post或者get請求中的參數資訊中非法字元即可,所以我們實現http 請求資訊過濾就可以判斷是是否受到sql注入攻擊。
IIS傳遞給asp.dll的get請求是是以字串的形式,當傳遞給Request.QueryString資料後,asp解析器會分析Request.QueryString的資訊,然後根據"&",分出各個數組內的資料所以get的攔截如下:
首先我們定義請求中不能包含如下字元
'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|xp_cmdshell
各個字元用"|"隔開,,然後我們判斷的得到的Request.QueryString
具體代碼如下

程式碼:

Dim sql_injdata
SQL_injdata = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|xp_cmdshell"
SQL_inj = split(SQL_Injdata,"|")

If Request.QueryString<>"" Then
For Each SQL_Get In Request.QueryString
For SQL_Data=0 To Ubound(SQL_inj)
If InStr(Request.QueryString(SQL_Get),Sql_Inj(Sql_DATA))>0 Then
Response.Write("<script language=""javascript"" type=""text/javascript"">alert(""提交的資訊中包含非法字元!"");</script>")
Response.End()
End If
Next
Next
End If

這樣我們就實現了get請求的注入的攔截,但是我們還要過濾post請求,所以我們還得繼續考慮request.form,這個也是以數組形式存在的,,我們只需要再進一次迴圈判斷即可。代碼如下

程式碼:
If Request.Form<>"" Then
For Each SQL_Get In Request.Form
For SQL_Data=0 To Ubound(SQL_inj)
If InStr(Request.QueryString(SQL_Get),Sql_Inj(Sql_DATA))>0 Then
Response.Write(&......餘下全文>>
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.