張季
摘要:Web中數(shù)據(jù)庫的應(yīng)用越來越廣泛,SQL的注入也成為了黑客攻擊數(shù)據(jù)庫比較常見的手段。文章對SQL注入攻擊的一些相關(guān)原理進(jìn)行了簡要的說明。并對現(xiàn)階段SQL注入攻擊的特點(diǎn)進(jìn)行了研究和剖析,然后在這個(gè)基礎(chǔ)之上提供了幾種對SQL進(jìn)行預(yù)防的防護(hù)方法。并且對這些方法的使用情況進(jìn)行了必要的說明
關(guān)鍵詞:SQL注入 研究 預(yù)防對策
隨著互聯(lián)網(wǎng)的發(fā)展,大量的web網(wǎng)站開始涌現(xiàn),極大地方便了人們的信息獲取需求。與此同時(shí),黑客針對網(wǎng)站的攻擊也屢屢出現(xiàn),造成了或多或少的經(jīng)濟(jì)損失現(xiàn)代社會,而近年來互聯(lián)網(wǎng)技術(shù)的發(fā)展迅猛,以因特網(wǎng)為基礎(chǔ)平臺的Web應(yīng)用系統(tǒng)在計(jì)算機(jī)的各個(gè)領(lǐng)域都有了越來越廣泛的用途。譬如企業(yè)的辦公系統(tǒng)以及電子商務(wù)系統(tǒng)等等。這些系統(tǒng)絕大多數(shù)都是采用的HTTP的方式進(jìn)行數(shù)據(jù)的傳遞,然后將這些數(shù)據(jù)相關(guān)組織的數(shù)據(jù)庫當(dāng)中,這些數(shù)據(jù)對一些不法分子來說具有非常大的吸引力,這就給數(shù)據(jù)的安全性造成了很大的安全隱患,比較典型的就是SQL的注入。
一、SQL注入
從目前的情況來看,現(xiàn)在的Web應(yīng)用程序在一般情況下采用的都是依靠數(shù)據(jù)庫為用戶進(jìn)行寫、度數(shù)據(jù)的方法,但是,在另一方面,由于從事程序編程人員的水平參差不齊,絕大多數(shù)編程的工作者沒有在編寫程序的時(shí)候?qū)τ脩魯?shù)據(jù)的合法性進(jìn)行辨別,這就導(dǎo)致在應(yīng)用程序的過程中出現(xiàn)了安全隱患。SQL注入,簡單的來說,就是不法分子利用高科技手段改變原來數(shù)據(jù)的查詢語句,并把這個(gè)命令提交給服務(wù)器,并在這個(gè)基礎(chǔ)之上執(zhí)行惡意的SQL命令然后不法分子在依據(jù)數(shù)據(jù)返回的結(jié)果中獲取攻擊者想要得到的信息,進(jìn)行下一步的不法活動(dòng)。
(一)關(guān)于SQL的注入原理
眾所周知,SQL注入的目的就是對數(shù)據(jù)庫進(jìn)行攻擊,然后在攻擊數(shù)據(jù)庫的基礎(chǔ)之上在攻擊其所在的服務(wù)器,而這種攻擊的主要方式就是不法分子將代碼在參數(shù)中進(jìn)行植入,而這些參數(shù)會被植入SQL命令中加已執(zhí)行。例如將惡意的代碼插入到字符串當(dāng)中,然后在這個(gè)基礎(chǔ)之上將這些字符串保存在數(shù)據(jù)庫當(dāng)中的數(shù)據(jù)表中,或者將其當(dāng)作元數(shù)據(jù),當(dāng)被存儲的字符串植入到動(dòng)態(tài)的SQL命令當(dāng)中來的時(shí)候,這些惡意的代碼就會被執(zhí)行。雖然數(shù)據(jù)庫的類型是多種多樣的,但是SQL注入攻擊的原理和基本過程確是基本上都一樣的。結(jié)合其他學(xué)者的相關(guān)研究,本文將SQL注入的類別分為用戶登錄類別以及其他類兩種類型。在用戶登錄的類別當(dāng)中,不法分子可以繞過存在安全隱患的登錄框進(jìn)行登錄,而在其他類別中,其則需要對攻擊的對象進(jìn)行更深一步的分析,并對數(shù)據(jù)庫的類型有一定的了解,只有通過這樣的途徑,其才能實(shí)現(xiàn)SQL的注入,也只有在這個(gè)基礎(chǔ)之上才能毒數(shù)據(jù)庫進(jìn)行攻擊。
我們都知道,SQL的注入對數(shù)據(jù)庫的危害是非常大的,攻擊者不僅可以利用已經(jīng)存在的SQL漏洞對服務(wù)器進(jìn)行攻擊,對數(shù)據(jù)庫的敏感信息進(jìn)行盜竊、竊取,甚至還有的不法分子會對服務(wù)器的信息進(jìn)行肆意的篡改和刪除,技術(shù)水平高的不法分子還有可能種植后門程序,這種行為導(dǎo)致的最嚴(yán)重的后果就是當(dāng)不法分子一旦獲取該服務(wù)器的最高管理權(quán)限,其就可能實(shí)現(xiàn)整個(gè)操作系統(tǒng)的控制,有的甚至導(dǎo)致系統(tǒng)無法進(jìn)行日常的運(yùn)行甚至?xí)?dǎo)致整個(gè)系統(tǒng)的癱瘓。
二、關(guān)于SQL注入攻擊的防范措施
(一)參數(shù)化語句
由于數(shù)據(jù)庫所執(zhí)行的多數(shù)都是由SQL查詢創(chuàng)建成的字符串,因此該構(gòu)造方式極易導(dǎo)致應(yīng)用系統(tǒng)受到SQL注入攻擊。一般情況下,在編程語言和數(shù)據(jù)庫訪問API時(shí),可采用占位符或綁定變量的方法為SQL查詢提供必要參數(shù),以此替代對用戶輸入進(jìn)行操作。這種稱為參數(shù)化查詢的方法更加安全可靠,它能夠盡可能地避免應(yīng)用中常見的SQL注入漏洞,并可在多數(shù)情況下代替現(xiàn)有的動(dòng)態(tài)查詢,對一般數(shù)據(jù)庫來說其效率更高。參數(shù)化查詢語句能夠?yàn)閿?shù)據(jù)庫提供預(yù)處理語句功能,從而優(yōu)化查詢并進(jìn)一步提高后續(xù)查詢性能
(二)輸入驗(yàn)證
輸入驗(yàn)證是一種功能強(qiáng)大的SQL注入控制手段。所謂輸入驗(yàn)證,就是通過對應(yīng)用程序的輸入數(shù)據(jù)進(jìn)行驗(yàn)證,從而保證其符合應(yīng)用程序中已定義標(biāo)準(zhǔn)的過程。此方法既可以將參數(shù)限制成固定的某種類型,也可以通過使用正則表達(dá)式或業(yè)務(wù)邏輯進(jìn)行輸入驗(yàn)證。
(三)編碼輸出
除驗(yàn)證輸入方法外,還應(yīng)對不同模塊或部分應(yīng)用間互相傳遞的內(nèi)容進(jìn)行編碼。在SQL語境中,對發(fā)送至數(shù)據(jù)庫的內(nèi)容進(jìn)行編碼或引用是必要的操作,這樣能夠保證內(nèi)容被正確的處理。除此以外,當(dāng)正在使用的數(shù)據(jù)未經(jīng)過嚴(yán)格審查,或數(shù)據(jù)來自第三方時(shí),還應(yīng)對數(shù)據(jù)庫信息進(jìn)行編碼。該方法適用于無法使用參數(shù)化查詢語句的情況,此時(shí)則需對發(fā)送至數(shù)據(jù)庫的數(shù)據(jù)進(jìn)行編碼,但如果當(dāng)數(shù)據(jù)庫查詢某個(gè)值沒有編碼時(shí),該應(yīng)用程序仍然易受到SQL注入的攻擊。
通過上述分析,我們可以發(fā)現(xiàn)SQL注入對數(shù)據(jù)庫的危害是非常大的,這也對現(xiàn)代社會的信息犯罪提供了一種新的犯罪手段,最大限度的減少SQL注入漏洞可以有效的對SQL的注入風(fēng)險(xiǎn)進(jìn)行預(yù)防,正如上文提到的,我們一定要結(jié)合SQL注入的原理來探討SQL的預(yù)防方法,只有這樣做,其防御措施才能夠做到實(shí)時(shí)有效。從目前的情況來看,市面上已經(jīng)出現(xiàn)了一些能夠自動(dòng)監(jiān)測SQL注入的工具和攻擊工具,但是這些都是最基本的東西,要想更進(jìn)一步的對SQL注入進(jìn)行更加有效的預(yù)防,還是有必要對SQL注入的原理進(jìn)行更加深入的研究,然后在這個(gè)基礎(chǔ)之上采取正確、合理的應(yīng)對措施,最好能做到防患于未然,只要做到這些,SQL的注入危害還是可以避免的。