SQL關(guān)于特殊字符處理的基本方法

字號:

一定要對用戶可能輸入的諸如引號,尖括號等特殊字符給予足夠重視,它們可能引發(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)換。