關於SQL注入攻擊與防範

才智咖 人氣:2.2W

隨著網路的普及,關係資料庫的廣泛應用,網路安全越來越重要。下面是本站小編為大家搜尋整理了關於SQL注入攻擊與防範,歡迎參考閱讀,希望對大家有所幫助。想了解更多相關資訊請持續關注我們應屆畢業生培訓網!

關於SQL注入攻擊與防範

一、 SQL注入攻擊

簡言之,SQL注入是應用程式開發人員未預期地把SQL程式碼傳入到應用程式的過程。它由於應用程式的糟糕設計而成為可能,並且只有那些直接使用使用者提供的值構建SQL語句的應用程式才會受影響。

例如:使用者輸入客戶ID後,GridView顯示客戶的全部行記錄。在一個更加真實的案例中,使用者還要輸入密碼之類的驗證資訊,或者根據前面的登入頁面得到使用者ID,可能還會有一些使用者輸入關鍵資訊的文字框,如訂單的日期範圍或產品名稱。問題在於命令是如何被執行的。在這個示例中,SQL語句通過字串構造技術動態建立。文字框txtID的值被直接複製到字串中。下面是程式碼:

在這個示例中,攻擊者可以篡改SQL語句。通常,攻擊的第一個目標是得到錯誤資訊。如果錯誤沒有被恰當處理,底層的資訊就會暴露給攻擊者。這些資訊可用於進一步攻擊。

例如,想象一下在文字一下在文字框中輸入下面的字串會發生什麼?

ALFKI'OR '1'='1

再看看因此生成的完整SQL語句:

這條語句將返回所有的訂單記錄,即便那些訂單不是由ALFDI建立,因為對每一行而言而有信1=1總是true。這樣產生的後果是沒有顯示當前使用者特定資訊,卻向攻擊者顯示了全部資料,如果螢幕上顯示的是敏感資訊,如社會保險號,生日或信用卡資料,就會帶來嚴重的問題。事實上,這些簡單的SQL注入往往是困擾那些大型電子商務公司的麻煩。一般而言,攻擊點不在於文字框而在於查詢字串(可被用於向資料庫傳送值,如列表頁向詳細資訊頁面傳送唯一識別符號)。

還可以進行更復雜的攻擊。例如,攻擊者可以使用兩個連線號(--)註釋掉SQL語句的剩餘部分。這樣的攻擊只限於SQL Server,不過對於其他型別的資料庫也有等效的辦法,如MySql使用(#)號,Oracle使用(;)號。另外攻擊者還可以執行含有任意SQL語句的批處理命令。對於SQL Server提供程式,攻擊者只需在新命令前加上分號(;)。攻擊者可以採用這樣的方式刪除其他表的內容,甚至呼叫SQL Server的系統儲存過程xp_cmdshell在命令執行任意的程式。

下面是攻擊者在文字框中輸入的,它的攻擊目標是刪除Customers表的全部行。

LUNCHUN’;DELETE*FROM Customers--

二、防範

如何預防SQL注入攻擊呢?需要記住幾點。首先,使用ength屬性防止使用者輸入過長的字元是一個好辦法。因為它們不夠長,也就減少了貼入大量指令碼的可能性。其次,要使用驗證控制元件鎖定錯誤的資料(如文字、空格、數值中的特殊字元)。另外,要限制錯誤資訊給出的提示。捕獲到資料庫異常時,只顯示一些通用的資訊(如“資料來源錯誤”)而不是顯示age屬性中的資訊,它可能暴露了系統攻擊點。

更為重要的是,一定要小心去除特殊字元。比如,可以將單引號替換為兩個單引號,這樣它們就不會和SQL語句的分隔符混淆:

string ID=()ace(“’”,”’’”);

當然,如果文字確實需要包含單引號,這樣做就引入了其他麻煩。另外,某些SQL注入攻擊還是可行的。替換單引號可以防止使用者提前結束一個字串,然而,如果動態構建含有數值的SQL語句,SQL注入攻擊又有發揮的空間了。這個漏洞常被(這是很危險的)忽視。更好的解決辦法是使用引數化的命令或使用儲存過程執行轉義以防止SQL注入攻擊。

另一個好建議是限制用於訪問資料庫的賬號的許可權。這樣該賬號將沒有許可權訪問其他資料庫或執行擴充套件的儲存過程。不過這樣並不能解決SQL指令碼注入的問題,因為用於連線資料庫的程序幾乎總是需要比任意單個使用者更大的許可權。通過限制許可權,可以預防刪除表的攻擊,但不能阻止攻擊者偷看別人的.資訊

三、POST注入攻擊

精明的使用者可能會知道還有另外一個Web控制元件攻擊的潛在途徑。雖然引數化的命令防止了SQL注入攻擊,但它們不能阻止攻擊者向回發到伺服器的資料新增惡意的值。如果不檢查這些值,就使得攻擊者可以提交本來不可能存在的控制元件值。

例如,假設你有一個顯示當前使用者訂單的列表。狡詐的攻擊者可能儲存該頁面的一個本地副本,修改HTML內容向列表新增更多的專案,然後選擇某個“假”的專案。如果攻擊成功,攻擊者就能夠看到其他使用者訂單,這顯然是一個問題。幸好,使用一個很少被提及的叫做“事件驗證”的特性來防止這種攻擊。事件驗證檢查回發到伺服器的資料並驗證其中值的合法性。例如,如果回發的資料表明使用者選擇了一個沒有意義的資料(因為它在控制元件中並不存在),就產生一個錯誤並停止處理。可以在Page指令中設定EnableEventValidation特性為false來禁用事件驗證。建立使用客戶端指令碼動態改變內容的頁面時,需要執行這一步。不過,此時在使用這些值之前要注意檢查潛在的POST注入攻擊。