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){
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