網頁通常是進行SQL查尋的輸入數據的前台,也作為查尋結果返還的界面,許多網絡程序員還不熟悉如何將輸入數據轉換為一個SQL語句, 同時他們也忘記了沒有預處理,數據不能按SQL語句原樣傳給網頁的原則。
當用戶數據傳給SQL語句時, 最常見的錯誤通常是這樣的:strUserData=request.form("T1")
strSQLData="select Name from UserNames where Name='" & strUserData & '"
這裡strSQLData是被用於SQL語局去檢索數據庫(這個特別的例子是用VBScript寫的,但對於任何檢索數據庫的腳本語言都是可行的)。
表面上看這種結構沒有什麼問題,但如果傳給form T1的字符串包含單引號(轉換為變量strUserData), 如象David's FrIEnd的字符串,SQL語句就會報錯。
原因很簡單:單引號用來在SQL語句中描述字符串數據。在上面的例子中,變量strUserData中的單引號會被當成語巨中Name='部分的結束符,而不是相應的字符串。
解決方法是用兩個單引號替代單個單引號,這樣David's Friend可以變成 David''s Friend, 整個字符串會變為:Select Name from UserNames where Name='David''s FrIEnd'
在網頁上解決這個問題的方法是寫一個函數來永久性用兩個單引號替代單個單引號。
Function Quotes(strInput)
strInput=replace(strInput,"'","''")
End Function
這個函數可以被放到任何有SQL Server檢索的網頁中strUserData=Quotes(request.form("T1"))
輸入數據在傳給SQL Server前應當以這種方式進行淨化, 如何完成這點取決於使用的腳本語言種類。
除了造成SQL失敗的結果外,另一個這種錯誤的嚴重副作用是一個惡意的聰明用戶可以利用這種錯誤, 讓SQL Server執行破壞性的代碼。