1. 程式人生 > >防止通過POST和GET方法SQL注入的兩個最徹底過濾程式

防止通過POST和GET方法SQL注入的兩個最徹底過濾程式

先針對POST遞交上來的資訊過濾程式

Public Function filterStr(str)
   str=replace(str,CHR(59),";") '“;”
   str=replace(str,CHR(38),"&") '“&”
   str=replace(str,chr(0),"")
   str=replace(str,chr(9)," ") '“ ”
   str=replace(str,chr(32)," ") '“ ”
   str=replace(str,chr(34),""")'“"”
   str=replace(str,CHR(37),"%") '“%”
   str=replace(str,CHR(39),"'") '“'”
   str=replace(str,Chr(40),"(") '“(”
   str=replace(str,Chr(41),")") '“)” 
   str=replace(str,CHR(42),"*") '“*”
   str=replace(str,CHR(44),",") '“,”
   str=replace(str,CHR(45)&CHR(45),"--") '“--”
   str=replace(str,CHR(60),"<") '“<”
   str=replace(str,CHR(61),"=") '“=”
   str=replace(str,CHR(62),">") '“>”
   str=replace(str,CHR(92),"\") '“\”
   str=replace(str,chr(13),"")
   str=replace(str,chr(10),"<br />")
   str=replace(str,CHR(10)&CHR(10),"</p><p>")
   filterStr=str
End Function

給每一個傳遞上來的物件過濾下,特殊字元全部過濾成ASCII碼,一切皆不可能。。。

再針對GET遞交上來的資訊過濾程式

Public Function ChkSqlIn()
Dim Fy_Get, Fy_In, Fy_Inf, Fy_Xh
Fy_In = "'|;|or|and|(|)|*|%|exec|insert|select|delete|update|count|chr|char|nchar|asc|
unicode|mid|substring|master|truncate|drop|declare|%20from|cmdshell|admin|net%20user
|net%20localgroup|1=1|1=2|user>0|id=1"
Fy_Inf = Split(Fy_In, "|")

If Request.QueryString <> "" Then
    For Each Fy_Get In Request.QueryString
        For Fy_Xh = 0 To UBound(Fy_Inf)
            If InStr(LCase(Request.QueryString(Fy_Get)), Fy_Inf(Fy_Xh)) <> 0 Then
                Response.Write "<Script>alert('對不起,可能出錯了!');</Script>"
                Fy_Get = ""
                Fy_In = ""
                Fy_Inf = ""
                Fy_Xh = ""
                Response.End
            End If
        Next
    Next
End If
   Fy_Get = "": Fy_In = "": Fy_Inf = "": Fy_Xh = ""
End Function

通過瀏覽器位址列傳遞的資料過濾,同樣一切皆不可能

再出SQL防黑4招

第一招:更換表名,欄位名

不要把管理員表名設成“admin”,“administrator”,“users”
不要把欄位名設成“admin”,“name”,“username”,“password”,“pwd”
改成“only_name”,“good_pwd”等等,發揮你的想象力,也可以用中文名。
資料庫欄位名千萬不要和前臺表單名相同!!!(如註冊頁面)
這樣可以大大增加人肉猜測難度,猜中可以買彩票了。

第二招:給密碼上MD5加密

好處是就算猜到了資料庫中有個[all_users]表中的管理員欄位[my_admin],得到使用者名稱,但密碼卻是一段加密後的16位數字,如果直接用update修改表中的密碼,那也不行,因為前臺還是需要通過MD5來驗證密碼,在表中更改密碼為12345,仍然無法進入管理頁面。

第三招:不要把報錯資訊展示給對方

on error resume next ‘這句話寫在網頁最上面 
… ….‘中間程式 
if err.number<>0 then ‘可寫可不寫,如果需要知道錯在哪裡,用err.description寫到其他地方 
err.clear 
response.write "程式出錯了..." 
end if 
這樣想通過報錯資訊揣摩資料庫內部結構就沒轍了

第四招:禁止站外遞交

if instr(request.serverVariables("HTTP_REFERER"),"http://"&request.serverVariables("HTTP_HOST"))<1 then response.end
這樣想通過本地網頁遞交資訊就不可能了。

當然,網頁技術上沒有密不透風的牆。就算換表名一樣可能被猜到,或者用軟體窮舉出來,MD5編碼有破解器,錯誤資訊有沒有可能對資深黑客都無所謂,通過修改本地什麼設定依然可以站外遞交,只不過相當繁瑣而已,如果只是中小網站,資深黑客也全然沒有興趣在上面浪費時間,而以上幾步對付小黑客是足夠了。

最後,害人之心不可有,防人之心不可無。

附上CHR碼值對應表

Chr(0) 為0的字元
Chr(1)        
Chr(2)        
Chr(3)        
Chr(4)        
Chr(5)        
Chr(6)        
Chr(7) 響鈴
Chr(8) 回格
Chr(9) tab水平
Chr(10) 換行
Chr(11) tab垂直
Chr(12) 換頁
Chr(13) 回車
Chr(14)        
Chr(15)        
Chr(16)        
Chr(17)        
Chr(18)        
Chr(19)        
Chr(20)        
Chr(21)        
Chr(22)        
Chr(23)        
Chr(24)        
Chr(25)        
Chr(26) 結束End
Chr(27) Pausebreak鍵
Chr(28)        
Chr(29)        
Chr(30)        
Chr(31)        
Chr(32) 空格SPACE
Chr(33) !