- 相關(guān)推薦
關(guān)于SQL注入攻擊與防范
隨著(zhù)網(wǎng)絡(luò )的普及,關(guān)系數據庫的廣泛應用,網(wǎng)絡(luò )安全越來(lái)越重要。下面是YJBYS小編為大家搜索整理了關(guān)于SQL注入攻擊與防范,歡迎參考閱讀,希望對大家有所幫助。想了解更多相關(guān)信息請持續關(guān)注我們應屆畢業(yè)生培訓網(wǎng)!
一、 SQL注入攻擊
簡(jiǎn)言之,SQL注入是應用程序開(kāi)發(fā)人員未預期地把SQL代碼傳入到應用程序的過(guò)程。它由于應用程序的糟糕設計而成為可能,并且只有那些直接使用用戶(hù)提供的值構建SQL語(yǔ)句的應用程序才會(huì )受影響。
例如:用戶(hù)輸入客戶(hù)ID后,GridView顯示客戶(hù)的全部行記錄。在一個(gè)更加真實(shí)的案例中,用戶(hù)還要輸入密碼之類(lèi)的驗證信息,或者根據前面的登錄頁(yè)面得到用戶(hù)ID,可能還會(huì )有一些用戶(hù)輸入關(guān)鍵信息的文本框,如訂單的日期范圍或產(chǎn)品名稱(chēng)。問(wèn)題在于命令是如何被執行的。在這個(gè)示例中,SQL語(yǔ)句通過(guò)字符串構造技術(shù)動(dòng)態(tài)創(chuàng )建。文本框txtID的值被直接復制到字符串中。下面是代碼:
在這個(gè)示例中,攻擊者可以篡改SQL語(yǔ)句。通常,攻擊的第一個(gè)目標是得到錯誤信息。如果錯誤沒(méi)有被恰當處理,底層的信息就會(huì )暴露給攻擊者。這些信息可用于進(jìn)一步攻擊。
例如,想象一下在文本一下在文本框中輸入下面的字符串會(huì )發(fā)生什么?
ALFKI'OR '1'='1
再看看因此生成的完整SQL語(yǔ)句:
這條語(yǔ)句將返回所有的訂單記錄,即便那些訂單不是由ALFDI創(chuàng )建,因為對每一行而言而有信1=1總是true。這樣產(chǎn)生的后果是沒(méi)有顯示當前用戶(hù)特定信息,卻向攻擊者顯示了全部資料,如果屏幕上顯示的是敏感信息,如社會(huì )保險號,生日或信用卡資料,就會(huì )帶來(lái)嚴重的問(wèn)題。事實(shí)上,這些簡(jiǎn)單的SQL注入往往是困擾那些大型電子商務(wù)公司的麻煩。一般而言,攻擊點(diǎn)不在于文本框而在于查詢(xún)字符串(可被用于向數據庫傳送值,如列表頁(yè)向詳細信息頁(yè)面傳送唯一標識符)。
還可以進(jìn)行更復雜的攻擊。例如,攻擊者可以使用兩個(gè)連接號(--)注釋掉SQL語(yǔ)句的剩余部分。這樣的攻擊只限于SQL Server,不過(guò)對于其他類(lèi)型的數據庫也有等效的辦法,如MySql使用(#)號,Oracle使用(;)號。另外攻擊者還可以執行含有任意SQL語(yǔ)句的批處理命令。對于SQL Server提供程序,攻擊者只需在新命令前加上分號(;)。攻擊者可以采用這樣的方式刪除其他表的內容,甚至調用SQL Server的系統存儲過(guò)程xp_cmdshell在命令執行任意的程序。
下面是攻擊者在文本框中輸入的,它的攻擊目標是刪除Customers表的全部行。
LUNCHUN’;DELETE*FROM Customers--
二、防范
如何預防SQL注入攻擊呢?需要記住幾點(diǎn)。首先,使用TextBox.MaxLength屬性防止用戶(hù)輸入過(guò)長(cháng)的字符是一個(gè)好辦法。因為它們不夠長(cháng),也就減少了貼入大量腳本的可能性。其次,要使用ASP.NET驗證控件鎖定錯誤的數據(如文本、空格、數值中的特殊字符)。另外,要限制錯誤信息給出的提示。捕獲到數據庫異常時(shí),只顯示一些通用的信息(如“數據源錯誤”)而不是顯示Exception.Message屬性中的信息,它可能暴露了系統攻擊點(diǎn)。
更為重要的是,一定要小心去除特殊字符。比如,可以將單引號替換為兩個(gè)單引號,這樣它們就不會(huì )和SQL語(yǔ)句的分隔符混淆:
string ID=txtID.Text().Replace(“’”,”’’”);
當然,如果文本確實(shí)需要包含單引號,這樣做就引入了其他麻煩。另外,某些SQL注入攻擊還是可行的。替換單引號可以防止用戶(hù)提前結束一個(gè)字符串,然而,如果動(dòng)態(tài)構建含有數值的SQL語(yǔ)句,SQL注入攻擊又有發(fā)揮的空間了。這個(gè)漏洞常被(這是很危險的)忽視。更好的解決辦法是使用參數化的命令或使用存儲過(guò)程執行轉義以防止SQL注入攻擊。
另一個(gè)好建議是限制用于訪(fǎng)問(wèn)數據庫的賬號的權限。這樣該賬號將沒(méi)有權限訪(fǎng)問(wèn)其他數據庫或執行擴展的存儲過(guò)程。不過(guò)這樣并不能解決SQL腳本注入的問(wèn)題,因為用于連接數據庫的進(jìn)程幾乎總是需要比任意單個(gè)用戶(hù)更大的權限。通過(guò)限制權限,可以預防刪除表的攻擊,但不能阻止攻擊者偷看別人的信息
三、POST注入攻擊
精明的用戶(hù)可能會(huì )知道還有另外一個(gè)Web控件攻擊的潛在途徑。雖然參數化的命令防止了SQL注入攻擊,但它們不能阻止攻擊者向回發(fā)到服務(wù)器的數據添加惡意的值。如果不檢查這些值,就使得攻擊者可以提交本來(lái)不可能存在的控件值。
例如,假設你有一個(gè)顯示當前用戶(hù)訂單的列表。狡詐的攻擊者可能保存該頁(yè)面的一個(gè)本地副本,修改HTML內容向列表添加更多的項目,然后選擇某個(gè)“假”的項目。如果攻擊成功,攻擊者就能夠看到其他用戶(hù)訂單,這顯然是一個(gè)問(wèn)題。幸好,ASP.NET使用一個(gè)很少被提及的叫做“事件驗證”的特性來(lái)防止這種攻擊。事件驗證檢查回發(fā)到服務(wù)器的數據并驗證其中值的合法性。例如,如果回發(fā)的數據表明用戶(hù)選擇了一個(gè)沒(méi)有意義的數據(因為它在控件中并不存在),ASP.NET就產(chǎn)生一個(gè)錯誤并停止處理?梢栽赑age指令中設置EnableEventValidation特性為false來(lái)禁用事件驗證。創(chuàng )建使用客戶(hù)端腳本動(dòng)態(tài)改變內容的頁(yè)面時(shí),需要執行這一步。不過(guò),此時(shí)在使用這些值之前要注意檢查潛在的POST注入攻擊。
【SQL注入攻擊與防范】相關(guān)文章:
PHP防止SQL注入的例子09-25
網(wǎng)絡(luò )攻擊的常見(jiàn)手法及其防范措施01-23
oracle的sql語(yǔ)句01-21
SQL優(yōu)化大全09-09
SQL查詢(xún)語(yǔ)句大全10-24
SQL語(yǔ)句的理解原則10-05
PHP對象注入的實(shí)例分析08-27
mysql SQL語(yǔ)句積累參考10-02
執行sql原理l分析05-12
SQL中的單記錄函數08-12