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