經典 ASP (VBScript) 環境下,透過集中函數處理所有外部輸入 (Request.Form, QueryString, Cookies),實作 SQL 注入防護與 XSS 過濾。
Function CheckNum(str_str, int_quest, int_startnum, int_endnum)
Dim mystr, istr, iNum
mystr = Trim(str_str)
Select Case int_quest
Case 1: istr = Request.Form(mystr)
Case 2: istr = Request.QueryString(mystr)
Case 3: istr = Request.Cookies(mystr)
Case 4: istr = Request(mystr)
Case Else: istr = mystr
End Select
istr = Left(istr, 32) -- 限制長度防緩衝區溢位
If IsNumeric(istr) Then
iNum = CDbl(istr)
Else
iNum = int_startnum -- 非數值回傳預設最小值
End If
If int_endnum > -1 Then
If iNum < int_startnum Then iNum = int_startnum
If iNum > int_endnum Then iNum = int_endnum
End If
CheckNum = iNum
End Function
用法:id = CheckNum("id", 2, 1, 999999) (從 QueryString 取 id,範圍 1-999999)。
Function CheckStr(str_str, int_quest, int_type, int_strlen)
Dim mystr, istr
mystr = str_str
Select Case int_quest
Case 1: istr = Request.Form(mystr)
Case 2: istr = Request.QueryString(mystr)
Case 3: istr = Request.Cookies(mystr)
Case 4: istr = Request(mystr)
Case Else: istr = mystr
End Select
istr = "" & Trim(istr)
istr = Replace(istr, "'", "''") -- SQL 單引號轉義 (核心防注入)
Select Case int_type
Case 1: -- 保留換行轉
, 空格轉
istr = Replace(istr, Chr(32), " ")
istr = Replace(istr, Chr(9), " ")
istr = Replace(istr, Chr(10) & Chr(10), "
")
istr = Replace(istr, Chr(10), "
")
istr = Replace(istr, Chr(13), "")
Case 2: -- 純文字,不處理 HTML
istr = istr
Case 3: -- 標題過濾:編碼 < > " ' 空白
istr = Replace(istr, Chr(32), " ")
istr = Replace(istr, Chr(9), " ")
istr = Replace(istr, Chr(13), "")
istr = Replace(istr, "<", "<")
istr = Replace(istr, ">", ">")
istr = Replace(istr, Chr(34), """)
istr = Replace(istr, " ", " ")
istr = Replace(istr, Chr(39), "'")
Case Else: -- 預設:完整 HTML 編碼 + 換行處理
istr = Replace(istr, Chr(32), " ")
istr = Replace(istr, Chr(9), " ")
istr = Replace(istr, Chr(10) & Chr(10), "
")
istr = Replace(istr, Chr(10), "
")
istr = Replace(istr, Chr(13), "")
istr = Replace(istr, "<", "<")
istr = Replace(istr, ">", ">")
istr = Replace(istr, Chr(34), """)
istr = Replace(istr, " ", " ")
istr = Replace(istr, Chr(39), "'")
End Select
istr = CutStr(istr, int_strlen, "") -- 長度截斷
CheckStr = istr
End Function
Function CutStr(str_str, int_strlen, str_addtrr)
Dim k, i, c
k = 0
For i = 1 To Len(str_str)
c = Abs(Asc(Mid(str_str, i, 1)))
If c > 255 Then k = k + 2 Else k = k + 1 -- 中文算 2 寬度
If k >= int_strlen Then Exit For
Next
CutStr = Left(str_str, k) & str_addtrr
End Function
Request("xxx")。CheckNum,字串欄位用 CheckStr。Replace(istr, "'", "''") 是 SQL Server 單引號轉義核心,配合參數化查詢 (ADO Command 物件) 雙重防護。SqlParameter / Entity Framework 參數化,不再需要手工轉義。