一定要對用戶可能輸入的諸如引號,尖括號等特殊字符給予足夠重視,它們可能引發(fā)嚴(yán)重的安全問題。SQL注入的基本手法之一,就是利用對單引號未加過濾的安全漏洞。
用戶的輸入無非兩個用途:對數(shù)據(jù)庫操作或顯示在頁面上,下面分別對這兩種情況下特殊字符的處理加以說明。
1. 對數(shù)據(jù)庫操作
用戶輸入的數(shù)據(jù)用于對數(shù)據(jù)庫進行操作時,又分為兩種情況,一是進行寫庫操作,二是作為查詢條件。
1.1 寫庫操作
(insert及update都視為寫庫操作,這果以insert為例說明,update的處理相同)
一般采用insert語句或AddNew方法兩種方式進行寫庫操作,我們先來看insert語句:
DIM username,sqlstr
username = trim(Request.Form("uname"))
sqlstr = "insert into [userinfo] (username) values ('"& username &"')"
以SQL Server為例,使用這種方式寫庫,如果username中含用單引號('),會出錯。使用下面的自定義函數(shù),可以將單引號進行轉(zhuǎn)換:
Rem 轉(zhuǎn)換SQL非法字符
function SQLEncode(fString)
if isnull(fString) then
SQLEncode = ""
exit function
end if
SQLEncode=replace(fString,"'","''")
end function
以上函數(shù)將一個單引號轉(zhuǎn)換為兩個連續(xù)的單引號,數(shù)據(jù)庫能夠接受,并以一個單引號寫入。SQL語句改為:
sqlstr = "insert into [userinfo] (username) values ('"& SQLEncode(username) &"')"
再來看AddNew方法:
DIM username
username = trim(Request.Form("uname"))
'MyRst為Recordset對象,MyConn為Connection對象
MyRst.open "[userinfo]",MyConn,0,3
MyRst.AddNew
MyRst("username").Value = username
MyRst.Update
MyRst.Close
使用這種方式寫庫時,不必調(diào)用SQLEncode()對單引號進行轉(zhuǎn)換,數(shù)據(jù)庫會自行處理。
對于存儲過程的的參數(shù),同樣不必進行單引號的轉(zhuǎn)換。
用戶的輸入無非兩個用途:對數(shù)據(jù)庫操作或顯示在頁面上,下面分別對這兩種情況下特殊字符的處理加以說明。
1. 對數(shù)據(jù)庫操作
用戶輸入的數(shù)據(jù)用于對數(shù)據(jù)庫進行操作時,又分為兩種情況,一是進行寫庫操作,二是作為查詢條件。
1.1 寫庫操作
(insert及update都視為寫庫操作,這果以insert為例說明,update的處理相同)
一般采用insert語句或AddNew方法兩種方式進行寫庫操作,我們先來看insert語句:
DIM username,sqlstr
username = trim(Request.Form("uname"))
sqlstr = "insert into [userinfo] (username) values ('"& username &"')"
以SQL Server為例,使用這種方式寫庫,如果username中含用單引號('),會出錯。使用下面的自定義函數(shù),可以將單引號進行轉(zhuǎn)換:
Rem 轉(zhuǎn)換SQL非法字符
function SQLEncode(fString)
if isnull(fString) then
SQLEncode = ""
exit function
end if
SQLEncode=replace(fString,"'","''")
end function
以上函數(shù)將一個單引號轉(zhuǎn)換為兩個連續(xù)的單引號,數(shù)據(jù)庫能夠接受,并以一個單引號寫入。SQL語句改為:
sqlstr = "insert into [userinfo] (username) values ('"& SQLEncode(username) &"')"
再來看AddNew方法:
DIM username
username = trim(Request.Form("uname"))
'MyRst為Recordset對象,MyConn為Connection對象
MyRst.open "[userinfo]",MyConn,0,3
MyRst.AddNew
MyRst("username").Value = username
MyRst.Update
MyRst.Close
使用這種方式寫庫時,不必調(diào)用SQLEncode()對單引號進行轉(zhuǎn)換,數(shù)據(jù)庫會自行處理。
對于存儲過程的的參數(shù),同樣不必進行單引號的轉(zhuǎn)換。