1. 程式人生 > >防止GET和POST方式引起的SQL注入攻擊ASP程式

防止GET和POST方式引起的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

各個字元用"|"隔開,,然後我們判斷的得到的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('請不要在引數中包含非法字元嘗試注入');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('請不要在引數中包含非法字元嘗試注入');history.back(-1)</Script>"
Response.end
end if
next
next
end if

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