發新話題

[教學]編寫通用的ASP防SQL注入攻擊程式

[教學]編寫通用的ASP防SQL注入攻擊程式

編寫通用的ASP防SQL注入攻擊程式

   SQL注入被那些菜鳥級別的所謂駭客高手玩出了滋味,發現現在大部分駭客入侵都是基於SQL注入實現的,哎,誰讓這個入門容易呢,好了,不說廢話了,現在我開始說如果編寫通用的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  

  各個字元用" "隔開,,然後我們判斷的得到的Request.QueryString,具體代碼如下 :


dim sql_injdata
SQL_injdata = "' and exec insert select delete update count * % chr mid master truncate char declare"
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=****>alert('天下電影聯盟SQL通用防注入系統提示↓nn請不要在參數中包含非法字元嘗試注入!');history.back(-1)</Script>"
    Response.end
   end if
  next
 Next
End If  

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

If Request.Form<>"" Then
 For Each Sql_Post In Request.Form
  For SQL_Data=0 To Ubound(SQL_inj)
   if instr(Request.Form(Sql_Post),Sql_Inj(Sql_DATA))>0 Then
    Response.Write "<Script Language=****>alert('天下電影聯盟SQL通用防注入系統提示↓nn請不要在參數中包含非法字元嘗試注入!nnHTTP://www.521movie.com ');history.back(-1)</Script>"
    Response.end
   end if
  next
 next
end if  

  好了大功告成,我們已經實現了get和post請求的資訊攔截,你只需要在conn.asp之類的打開資料庫檔之前引用這個頁面即可。放心的繼續開發你的程式,不用再考慮是否還會受到SQL注入攻擊。難道不是麼?

[ 本帖最後由 philxyz0316 於 2006-7-23 21:31 編輯 ]

TOP

在寫 ASP 程式時也碰過這個問題,不過後來的解決方式是決定不令使用者輸入的資料和資料庫有所連動,
也就是只讓使用者做我給他們做的事,也許也可以參考一下。

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。