SQL注入攻擊是我們程式語句中的不完全造成的,我們來看看在asp中怎麼用好instr函數有效地防止SQL注入攻擊。具體的應該是這樣的。
If instr(Request(id), )>0 or instr(Request(id),')>0 then response.redirect index.htm
當然,也可以在then後面寫你想要的!
讓我們先來學習instr這個函數吧:
文法
InStr([start, ]string1, string2[, compare])
InStr 函數的語法有以下參數:
參數描述
start 可選。數值表達式,用於設定每次搜尋的開始位置。如果省略,將從第一個字元的位置開始搜尋。如果start 包含Null,則會發生錯誤。如果已指定compare,則必須要有start 參數。
String1 必選。接受搜尋的字串表達式。
String2
必選。要搜尋的字串表達式。
Compare 可選。指示在計算子字串時所使用的比較類型的數值。有關數值,請參閱設定部分。如果省略,將執行二進位比較。
compare 參數可以有以下值:
常數值描述
vbBinaryCompare 0 執行二進位比較。
vbTextCompare 1 執行文字比較。
[傳回值]
InStr 函數傳回下列值:
如果InStr 返回
string1 為零長度0
string1 為Null Null
string2 為零長度start
string2 為Null Null
string2 沒有找到0
在string1 中找到string2 找到符合字串的位置
start > Len(string2) 0
下面的範例利用InStr 搜尋字串:
Dim SearchString, SearchChar, MyPos
SearchString =XXpXXpXXPXXP ' 要搜尋的字串。
SearchChar = P ' 搜尋P。
MyPos = Instr(4, SearchString, SearchChar, 1) '文字比較從第四個字元開始傳回6。
MyPos = Instr(1, SearchString, SearchChar, 0) '二進位比較從第1個字元開始傳回9。
MyPos = Instr(SearchString, SearchChar) ' 回傳9。
' 預設為二進位比較(最後一個參數省略)。
MyPos = Instr(1, SearchString, W) ' 二進位比較從第1個字元開始回傳0 (沒有找到W)。
注意InStrB 函數使用包含在字串中的位元組數據,所以InStrB 傳回的不是一個字串在另一個字串中第一次出現的字元位置,而是位元組位置。
總結概括:instr的功能是: 傳回字元或字串在另一個字串中第一次出現的位置,好了,讓我們在看看哪個程式碼:
if instr(Request(id), )>0 或 instr(Request(id),')>0 then
意義:比較字元(空格)與字元(')在request(id)中的具體位置(進行二進制比較),假如找到了(空格)與(')字符,那麼就是then 後的語句!
現在大家理解這個含義了吧!
當我看第一眼的時候我就說,假如在asp? Id=90加上字元(;或,)等等一些字元時不是造樣出錯嗎? (是,回答的肯定的:)
估計又有人說,那我會在if instr(Request(id), )>0 or instr(Request(id),')>0 then 語句中在加些字符,比如改為:if instr(Request(id ), )>0 或 instr(Request(id),')>0 或 instr(Request(id),;)>0 or instr(Request(id),, )>0 then
等等,你還可以在後面加,呵呵! (這個好啊!不過比較爛:)
是,這樣加上後,確實能桃過一些所謂的駭客們的手的!
其實沒必要,大家忘了instr(Request(id), )>0這句話了嗎,他還跟(空格)比較了啊!只要有這句話,那些所謂的駭客們的,and 1 = 1 不就沒用了嗎?