向書本學(xué)習(xí),還要向?qū)嵺`學(xué)習(xí)、向生活學(xué)習(xí)。消化已有知識,
而且要力求有所發(fā)現(xiàn)、有所發(fā)明、有所創(chuàng)造
2019/3/20 18:38:12
SQL注入攻擊的危害性很大。在講解其防止辦法之前,數(shù)據(jù)庫管理員有必要先了解一下其攻擊的原理。這有利于管理員采取有針對性的防治措施。
一、 SQL注入攻擊的簡單示例。
statement := "SELECT * FROM Users WHERE Value= " + a_variable + "
上面這條語句是很普通的一條SQL語句,他主要實現(xiàn)的功能就是讓用戶輸入一個員工編號然后查詢處這個員工的信息。但是若這條語句被不法攻擊者改裝過后,就可能成為破壞數(shù)據(jù)的黑手。如攻擊者在輸入變量的時候,輸入以下內(nèi)容SA001’;drop table c_order--。那么以上這條SQL語句在執(zhí)行的時候就變?yōu)榱薙ELECT * FROM Users WHERE Value= ‘SA001’;drop table c_order--。
這條語句是什么意思呢?‘SA001’后面的分號表示一個查詢的結(jié)束和另一條語句的開始。c_order后面的雙連字符 指示當(dāng)前行余下的部分只是一個注釋,應(yīng)該忽略。如果修改后的代碼語法正確,則服務(wù)器將執(zhí)行該代碼。系統(tǒng)在處理這條語句時,將首先執(zhí)行查詢語句,查到用戶編號為SA001 的用戶信息。然后,數(shù)據(jù)將刪除表C_ORDER(如果沒有其他主鍵等相關(guān)約束,則刪除操作就會成功)。只要注入的SQL代碼語法正確,便無法采用編程方式來檢測篡改。因此,必須驗證所有用戶輸入,并仔細(xì)檢查在您所用的服務(wù)器中執(zhí)行構(gòu)造 SQL命令的代碼。
二、 SQL注入攻擊原理。
可見SQL注入攻擊的危害性很大。在講解其防止辦法之前,數(shù)據(jù)庫管理員有必要先了解一下其攻擊的原理。這有利于管理員采取有針對性的防治措施。
SQL注入是目前比較常見的針對數(shù)據(jù)庫的一種攻擊方式。在這種攻擊方式中,攻擊者會將一些惡意代碼插入到字符串中。然后會通過各種手段將該字符串傳遞到SQLServer數(shù)據(jù)庫的實例中進(jìn)行分析和執(zhí)行。只要這個惡意代碼符合SQL語句的規(guī)則,則在代碼編譯與執(zhí)行的時候,就不會被系統(tǒng)所發(fā)現(xiàn)。
SQL注入式攻擊的主要形式有兩種。一是直接將代碼插入到與SQL命令串聯(lián)在一起并使得其以執(zhí)行的用戶輸入變量。上面筆者舉的例子就是采用了這種方法。由于其直接與SQL語句捆綁,故也被稱為直接注入式攻擊法。二是一種間接的攻擊方法,它將惡意代碼注入要在表中存儲或者作為原書據(jù)存儲的字符串。在存儲的字符串中會連接到一個動態(tài)的SQL命令中,以執(zhí)行一些惡意的SQL代碼。
注入過程的工作方式是提前終止文本字符串,然后追加一個新的命令。如以直接注入式攻擊為例。就是在用戶輸入變量的時候,先用一個分號結(jié)束當(dāng)前的語句。然后再插入一個惡意SQL語句即可。由于插入的命令可能在執(zhí)行前追加其他字符串,因此攻擊者常常用注釋標(biāo)記“—”來終止注入的字符串。執(zhí)行時,系統(tǒng)會認(rèn)為此后語句位注釋,故后續(xù)的文本將被忽略,不背編譯與執(zhí)行。
三、 SQL注入式攻擊的防治。
既然SQL注入式攻擊的危害這么大,那么該如何來防治呢?下面這些建議或許對數(shù)據(jù)庫管理員防治SQL注入式攻擊有一定的幫助。
1、 普通用戶與系統(tǒng)管理員用戶的權(quán)限要有嚴(yán)格的區(qū)分。
如果一個普通用戶在使用查詢語句中嵌入另一個Drop Table語句,那么是否允許執(zhí)行呢?由于Drop語句關(guān)系到數(shù)據(jù)庫的基本對象,故要操作這個語句用戶必須有相關(guān)的權(quán)限。在權(quán)限設(shè)計中,對于終端用戶,即應(yīng)用軟件的使用者,沒有必要給他們數(shù)據(jù)庫對象的建立、刪除等權(quán)限。那么即使在他們使用SQL語句中帶有嵌入式的惡意代碼,由于其用戶權(quán)限的限制,這些代碼也將無法被執(zhí)行。故應(yīng)用程序在設(shè)計的時候,最好把系統(tǒng)管理員的用戶與普通用戶區(qū)分開來。如此可以最大限度的減少注入式攻擊對數(shù)據(jù)庫帶來的危害。
2、 強(qiáng)迫使用參數(shù)化語句。
如果在編寫SQL語句的時候,用戶輸入的變量不是直接嵌入到SQL語句。而是通過參數(shù)來傳遞這個變量的話,那么就可以有效的防治SQL注入式攻擊。也就是說,用戶的輸入絕對不能夠直接被嵌入到SQL語句中。與此相反,用戶的輸入的內(nèi)容必須進(jìn)行過濾,或者使用參數(shù)化的語句來傳遞用戶輸入的變量。參數(shù)化的語句使用參數(shù)而不是將用戶輸入變量嵌入到SQL語句中。采用這種措施,可以杜絕大部分的SQL注入式攻擊。不過可惜的是,現(xiàn)在支持參數(shù)化語句的數(shù)據(jù)庫引擎并不多。不過數(shù)據(jù)庫工程師在開發(fā)產(chǎn)品的時候要盡量采用參數(shù)化語句。
3、 加強(qiáng)對用戶輸入的驗證。
總體來說,防治SQL注入式攻擊可以采用兩種方法,一是加強(qiáng)對用戶輸入內(nèi)容的檢查與驗證;二是強(qiáng)迫使用參數(shù)化語句來傳遞用戶輸入的內(nèi)容。在SQLServer數(shù)據(jù)庫中,有比較多的用戶輸入內(nèi)容驗證工具,可以幫助管理員來對付SQL注入式攻擊。測試字符串變量的內(nèi)容,只接受所需的值。拒絕包含二進(jìn)制數(shù)據(jù)、轉(zhuǎn)義序列和注釋字符的輸入內(nèi)容。這有助于防止腳本
深圳市南山區(qū)南山街道南海大道西桂廟路北陽光華藝大廈1棟4F、4G-04
咨詢電話:136 8237 6272
大客戶咨詢:139 0290 5075
業(yè)務(wù)QQ:195006118
技術(shù)QQ:179981967