1.如果動態構造的sql語句中包含參數,請必須對參數做如下操作:
a.將'(單引號)替換成''(兩個單引號)
b.將--(注釋符)替換掉
c.將參數加入語句時,一定要在前后各加上引號,如:'select * from table where id='''+@id+''''這樣的加法.
2.如果動態構造的sql語句中包含表參數,請勿必給表加上[](中括號),如:'select * from ['+@tab+']'這樣的做法.
3..避免動態sql語句:尤其是從ie客戶端獲取查詢、修改、刪除條件的字段最容易被注入,例如上述從客戶端獲取personid,為了開發方便,直接把從客戶端獲取的persongid作為sql語句的條件,卻沒有對personid作必要的檢查,所以在開發時執行sql語句時最好使用preparedstatement類.
4.驗證數據:在客戶端ie使用網頁特效驗證用戶輸入數據的合法性作用其實不是很大,一定要在獲取客戶端數據之后,對數據進行嚴格的驗證,開發人員不要假想用戶只會輸入合法的數據,確保在應用程序中檢查分號、引號、括號、sql關鍵字等,可以使用正則表達式來進行復雜的模式匹配,運用它可以達到良好的效果.
×××網站地址薄查看程序需要傳遞一個personid,personid可以通過url參數傳遞,由于地址本查看程序直接獲取personid,沒有做任何數據合法性驗證,而且personid是字符串變量,獲取personid的代碼如下:
- if (getparameter(req,"personid")!=null){
- //開源代碼Vevb.com
- personid=getparameter(req,"personid").trim();
- }else{
- personid="";
- }
該程序中組合成的動態sql語句如下:
personsql="select * from 表名 where userid="+long.tostring(userid)+" and addrcontactid="+personid;
由于程序沒有檢查personid是否是整數,所以攻擊者隨便給personid賦一個值,即可繼續運行后續的程序邏輯,如果攻擊者輸入如下網址:
http://www.----------------------?personid=6414 or 2=2
組合成的sql語句如下:
select * from 表名where userid=1433620 and addrcontactid=6414 or 2=2
防范方法:sql注入漏洞可謂是“千里之堤,潰于蟻穴”,這種漏洞在網上極為普遍,通常是由于程序員對注入不了解,或者程序過濾不嚴格,或者某個參數忘記檢查導致,在這里,我給大家一個函數,代替asp教程中的request函數,可以對一切的sql注入say no,函數如下:
- function saferequest(paraname,paratype)
- '--- 傳入參數 ---
- 'paraname:參數名稱-字符型
- 'paratype:參數類型-數字型(1表示以上參數是數字,0表示以上參數為字符)
- dim paravalue
- paravalue=request(paraname)
- if paratype=1 then
- if not isnumeric(paravalue) then
- response.write "參數" & paraname & "必須為數字型!"
- response.end
- end if
- else
- paravalue=replace(paravalue,"'","''")
- end if
- saferequest=paravalue
- end function
上面函數應用,對于int型的參數,如文章的id等,可以先判斷是不是整數,實例代碼如下:
- id =trim(request("id"))
- if id<>"" then
- if not isnumeric(id) then
- response.write"請提供數字型參數"
- response.end
- end if
- id = clng(id)
- else
- response.write"請輸入參數id"
- response.end
- end if
新聞熱點
疑難解答