汪冰 黃銀蓉
摘要:數(shù)據(jù)庫技術(shù)在計(jì)算機(jī)網(wǎng)絡(luò)和互聯(lián)網(wǎng)絡(luò)中起著至關(guān)重要的作用。在各種web應(yīng)用場景下,都有數(shù)據(jù)庫技術(shù)參與。SQL Server、Access、Oracle、MySQL等一系列數(shù)據(jù)庫管理系統(tǒng)被廣泛使用。作為web應(yīng)用結(jié)構(gòu)中的存儲(chǔ)層,數(shù)據(jù)庫服務(wù)器通過web應(yīng)用服務(wù)器與瀏覽器之間完成數(shù)據(jù)交互。在交互過程中經(jīng)常會(huì)面對(duì)各種網(wǎng)絡(luò)安全風(fēng)險(xiǎn),其中以SQL注入攻擊最為普遍。本文對(duì)數(shù)據(jù)庫安全基本要求、web應(yīng)用中數(shù)據(jù)庫運(yùn)轉(zhuǎn)原理進(jìn)行論述,闡述了國內(nèi)外對(duì)數(shù)據(jù)庫系統(tǒng)運(yùn)行安全和數(shù)據(jù)庫系統(tǒng)信息安全的相關(guān)標(biāo)準(zhǔn);以C/S模式為例,說明了web應(yīng)用的三層架構(gòu)。本文以SQL Server為例,列舉并實(shí)踐了幾種常見的SQL注入語句;利用自動(dòng)注入工具SQLMap對(duì)特定網(wǎng)站進(jìn)行SQL注入。本文以ASP等編程語言為例,簡單介紹了幾種行之有效并被廣泛使用的SQL注入防御手段。
關(guān)鍵詞:數(shù)據(jù)庫安全;web應(yīng)用;SQL注入;SQL注入防御
1.數(shù)據(jù)庫安全基本要求及威脅來源
數(shù)據(jù)庫及其相關(guān)技術(shù)在快速發(fā)展的計(jì)算機(jī)、互聯(lián)網(wǎng)應(yīng)用中起著至關(guān)重要的作用。幾乎所有常見的網(wǎng)站、web應(yīng)用程序和移動(dòng)終端應(yīng)用程序都運(yùn)用了數(shù)據(jù)庫及其相關(guān)技術(shù)。數(shù)據(jù)庫的定義是按照數(shù)據(jù)結(jié)構(gòu)來組織、存儲(chǔ)和管理數(shù)據(jù)的倉庫。它于20世紀(jì)60年代出現(xiàn)并伴隨著計(jì)算機(jī)和互聯(lián)網(wǎng)技術(shù)地快速演變?cè)?0世紀(jì)90年代后期得到迅速發(fā)展。在其發(fā)展的早期,與數(shù)據(jù)庫安全相關(guān)的防護(hù)技術(shù)并未受到業(yè)界重視。但隨著計(jì)算機(jī)和互聯(lián)網(wǎng)的普及,大量合法或不合法的用戶涌入網(wǎng)絡(luò)當(dāng)中,對(duì)網(wǎng)絡(luò)安全產(chǎn)生了巨大沖擊,于是業(yè)界開始關(guān)注網(wǎng)絡(luò)安全防護(hù)技術(shù),而數(shù)據(jù)庫安全技術(shù)則屬于網(wǎng)絡(luò)安全防護(hù)技術(shù)當(dāng)中十分重要的一個(gè)環(huán)節(jié)。
關(guān)于數(shù)據(jù)庫安全的定義,國內(nèi)外有不同的定義。國外以C. P. Pfleeger 在“Security in Computing – Database Security. PTR,1997”中對(duì)數(shù)據(jù)庫安全的定義最具有代表性,被國內(nèi)外許多教材、論文和培訓(xùn)廣泛應(yīng)用。他從以下方面對(duì)數(shù)據(jù)庫安全進(jìn)行了描述:
(1)物理數(shù)據(jù)庫的完整性:數(shù)據(jù)庫中的數(shù)據(jù)不被各種自然的或物理的問題而破壞,如電力問題或設(shè)備故障等。
(2)邏輯數(shù)據(jù)庫的完整性:對(duì)數(shù)據(jù)庫結(jié)構(gòu)的保護(hù),如對(duì)其中一個(gè)字段的修改不應(yīng)該破壞其他字段。
(3)元素安全性:存儲(chǔ)在數(shù)據(jù)庫中的每個(gè)元素都是正確的。
(4)可審計(jì)性:可以追蹤存取和修改數(shù)據(jù)庫元素的用戶。
(5)訪問控制:確保只有授權(quán)的用戶才能訪問數(shù)據(jù)庫,這樣不同的用戶被限制在不同的訪問方式。
(6)身份驗(yàn)證:不管是審計(jì)追蹤或者是對(duì)某一數(shù)據(jù)庫的訪問都要經(jīng)過嚴(yán)格的身份驗(yàn)證。
(7)可用性:對(duì)授權(quán)的用戶應(yīng)該隨時(shí)可進(jìn)行應(yīng)有的數(shù)據(jù)庫訪問。
我國在數(shù)據(jù)庫安全方面也有自己的定義,在《中華人民共和國公共安全行業(yè)標(biāo)準(zhǔn)GA/T389-2002》中“計(jì)算機(jī)信息系統(tǒng)安全等級(jí)保護(hù)數(shù)據(jù)庫管理系統(tǒng)技術(shù)要求”部分對(duì)數(shù)據(jù)庫安全的定義是:數(shù)據(jù)庫安全就是保證數(shù)據(jù)庫信息的保密性、完整性、一致性和可用性。保密性指保護(hù)數(shù)據(jù)庫中的數(shù)據(jù)不被泄露和未授權(quán)的獲取;完整性指保護(hù)數(shù)據(jù)庫中的數(shù)據(jù)不被破壞和刪除;一致性指確保數(shù)據(jù)庫中的數(shù)據(jù)滿足實(shí)體完整性、參照完整性和用戶定義完整性要求;可用性指確保數(shù)據(jù)庫中的數(shù)據(jù)不因人為的和自然的原因?qū)κ跈?quán)用戶不可用。其中保密性、完整性及可用性與信息安全三要素“CIA”相一致。
在實(shí)際生產(chǎn)應(yīng)用過程中,數(shù)據(jù)庫一般由數(shù)據(jù)庫管理系統(tǒng)來統(tǒng)一管理和控制,用戶可以通過數(shù)據(jù)庫管理系統(tǒng)訪問數(shù)據(jù)庫,數(shù)據(jù)庫管理員也可以通過它進(jìn)行數(shù)據(jù)庫的維護(hù)工作。常見的SQL Server、Access、Oracle、MySQL等都屬于數(shù)據(jù)庫管理系統(tǒng)。而我們所討論的數(shù)據(jù)庫安全技術(shù)主要就是針對(duì)數(shù)據(jù)庫管理系統(tǒng)的。數(shù)據(jù)庫管理系統(tǒng)的安全既要考慮數(shù)據(jù)庫管理系統(tǒng)的安全運(yùn)行保護(hù),也要考慮對(duì)數(shù)據(jù)庫管理系統(tǒng)中所存儲(chǔ)、傳輸和處理的數(shù)據(jù)信息的保護(hù)(包括以庫結(jié)構(gòu)形式存儲(chǔ)的用戶數(shù)據(jù)信息和以其他形式存儲(chǔ)的由數(shù)據(jù)庫管理系統(tǒng)使用的數(shù)據(jù)信息)。由于攻擊和威脅既可能是針對(duì)數(shù)據(jù)庫管理系統(tǒng)運(yùn)行的,也可能是針對(duì)數(shù)據(jù)庫管理系統(tǒng)中所存儲(chǔ)、傳輸和處理的數(shù)據(jù)信息的保密性、完成性和可用性的,所以對(duì)數(shù)據(jù)庫管理系統(tǒng)的安全保護(hù)的功能要求,需要從系統(tǒng)安全運(yùn)行和信息安全保護(hù)兩方面綜合進(jìn)行考慮。系統(tǒng)運(yùn)行安全和系統(tǒng)信息安全即是數(shù)據(jù)庫安全所包含的兩層含義。系統(tǒng)運(yùn)行安全一般面臨著數(shù)據(jù)庫管理系統(tǒng)本身可用性被破壞的威脅。網(wǎng)絡(luò)中的不法分子通過各種滲透技術(shù)入侵服務(wù)器,通過病毒、木馬等手段致使系統(tǒng)無法正常運(yùn)轉(zhuǎn),從而造成破壞性的后果;系統(tǒng)信息安全則主要包含保密性和完整性兩個(gè)方面的內(nèi)容。網(wǎng)絡(luò)中的不法分子通過注入技術(shù)取得數(shù)據(jù)庫中的各種用戶數(shù)據(jù),甚至可以通過代碼控制對(duì)數(shù)據(jù)進(jìn)行惡意刪除和修改,嚴(yán)重破壞數(shù)據(jù)信息的安全。
數(shù)據(jù)庫一般不會(huì)獨(dú)立存在于互聯(lián)網(wǎng)和計(jì)算機(jī)網(wǎng)絡(luò)之中,而是通常作為web應(yīng)用系統(tǒng)和web應(yīng)用程序的后端驅(qū)動(dòng)技術(shù)而存在。常見的web應(yīng)用系統(tǒng)有辦公自動(dòng)化系統(tǒng)、電子郵件系統(tǒng)、新聞網(wǎng)站、電子商城等;而常見的web應(yīng)用程序則更為普遍,我們的移動(dòng)終端上琳瑯滿目的應(yīng)用軟件后端幾乎都有數(shù)據(jù)庫技術(shù)在支撐其運(yùn)轉(zhuǎn)。圖1說明了web應(yīng)用和數(shù)據(jù)庫服務(wù)器之間的簡單交互關(guān)系(這里只針對(duì)C/S模式):
從圖1可以看到,用戶在使用各種web應(yīng)用系統(tǒng)或web應(yīng)用程序的時(shí)候,首先通過終端設(shè)備向web應(yīng)用服務(wù)器發(fā)起數(shù)據(jù)請(qǐng)求,web應(yīng)用服務(wù)器收到該請(qǐng)求以后再向數(shù)據(jù)服務(wù)器發(fā)起數(shù)據(jù)請(qǐng)求,數(shù)據(jù)服務(wù)器收到請(qǐng)求后返回響應(yīng)數(shù)據(jù)至web應(yīng)用服務(wù)器,web應(yīng)用服務(wù)器收到響應(yīng)數(shù)據(jù)后再反饋給終端設(shè)備。整個(gè)交互過程時(shí)間非常短暫,用戶一般不會(huì)察覺。但在交互過程中存在多處安全威脅,因此通信運(yùn)營商和各類互聯(lián)網(wǎng)服務(wù)提供商必須在關(guān)鍵節(jié)點(diǎn)做好安全防護(hù)工作,避免發(fā)生網(wǎng)絡(luò)信息安全事故。而在眾多安全防護(hù)工作中,數(shù)據(jù)庫安全尤為重要,在圖中的網(wǎng)絡(luò)環(huán)境下,我們可以將數(shù)據(jù)庫安全分為3個(gè)層次,分別為網(wǎng)絡(luò)安全、服務(wù)器安全和數(shù)據(jù)庫本身的安全。網(wǎng)絡(luò)安全側(cè)重于防護(hù)數(shù)據(jù)交互過程中的網(wǎng)絡(luò)嗅探、跨站腳本攻擊、緩沖區(qū)溢出攻擊、DDOS攻擊等;服務(wù)器安全側(cè)重于操作系統(tǒng)本身的安全,防護(hù)手段主要包括安裝正版操作系統(tǒng)、及時(shí)升級(jí)補(bǔ)丁、嚴(yán)格控制管理員賬戶權(quán)限、在關(guān)鍵節(jié)點(diǎn)架設(shè)防火墻等;數(shù)據(jù)庫安全側(cè)重于通過代碼審計(jì)、數(shù)據(jù)加密、數(shù)據(jù)備份、用戶權(quán)限控制等方式避免網(wǎng)絡(luò)不法分子對(duì)數(shù)據(jù)運(yùn)行安全和數(shù)據(jù)信息安全造成破壞。
在數(shù)據(jù)庫安全面臨的眾多威脅中,SQL注入是最為典型、破壞性最強(qiáng)的攻擊方式。在論述SQL注入以前,先對(duì)SQL進(jìn)行一個(gè)簡單介紹。SQL最早源于1974年IBM公司圣約瑟研究室研制的大型關(guān)系數(shù)據(jù)庫管理系統(tǒng)System R,其中包括了一套規(guī)范的數(shù)據(jù)庫語言——SEQUEL(Structured English Query Language),后于1980年正式更名為SQL。SQL按照功能一般分為四大類,分別是查詢語言(Data Query Language,DQL)、數(shù)據(jù)操作語言(Data Manipulation Language,DML)、數(shù)據(jù)定義語言(Data Definition Language,DDL)和數(shù)據(jù)控制語言(Data Control Language,DCL),詳見圖2:
2.Web應(yīng)用中的數(shù)據(jù)庫運(yùn)用原理
從圖1中我們已經(jīng)簡單了解了web應(yīng)用的基本架構(gòu)。主要分為表示層、邏輯層和存儲(chǔ)層(數(shù)據(jù)層)。展示web頁面的瀏覽器就位于表示層。表示層是web應(yīng)用的最高層,一般由用HTML(HyperText Markup Language,超文本標(biāo)記語言)等語言編寫的便于用戶查看的頁面組成。其主要作用就是與用戶進(jìn)行交互,或者說使用便于用戶理解、查看的方式將后臺(tái)數(shù)據(jù)呈現(xiàn)給用戶;邏輯層位于表示層與數(shù)據(jù)層之間,在數(shù)據(jù)交換中起承上啟下的作用,是三層架構(gòu)中的核心部分,其主要功能是負(fù)責(zé)在瀏覽器和后臺(tái)數(shù)據(jù)庫之間建立交互關(guān)系,將瀏覽器送來的請(qǐng)求指令進(jìn)行加工處理后發(fā)送至數(shù)據(jù)庫,同時(shí)將數(shù)據(jù)庫反饋回來的數(shù)據(jù)信息加工處理后傳遞給瀏覽器;數(shù)據(jù)層一般包括數(shù)據(jù)庫服務(wù)器、存儲(chǔ)數(shù)據(jù)的存儲(chǔ)設(shè)備和數(shù)據(jù)信息本身,所以數(shù)據(jù)層通常也被叫做存儲(chǔ)層。數(shù)據(jù)層的主要功能是負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)和檢索,一般數(shù)據(jù)庫服務(wù)器支持訪問數(shù)據(jù)庫文件、二進(jìn)制文件、文本文檔或是XML文檔。圖3將圖1進(jìn)行了細(xì)化,詳細(xì)展示了web應(yīng)用的工作原理:
當(dāng)用戶通過瀏覽器訪問某一個(gè)網(wǎng)站時(shí),瀏覽器會(huì)將用戶輸入的URL發(fā)送至web應(yīng)用服務(wù)器,web應(yīng)用服務(wù)器將URL進(jìn)行編譯處理,生成特定的SQL語句并發(fā)送至數(shù)據(jù)庫服務(wù)器執(zhí)行,之后數(shù)據(jù)庫服務(wù)器返回?cái)?shù)據(jù)信息至web應(yīng)用服務(wù)器,web應(yīng)用服務(wù)器再將數(shù)據(jù)信息加工處理為HTML并遞送至瀏覽器呈現(xiàn)給用戶。下面看一個(gè)實(shí)例:
我們通過火狐瀏覽器訪問了URL為http://www.aodiweixiu.com/about.asp?id=1的網(wǎng)頁,在這段URL中除了.com的域名外,后面還出現(xiàn)了“asp?id=1”這串代碼,這其中就涉及到瀏覽器和后臺(tái)服務(wù)器之間的參數(shù)傳遞。通過這個(gè)參數(shù)輸入節(jié)點(diǎn),我們就可以通過構(gòu)造特定的SQL語句對(duì)該網(wǎng)站的后臺(tái)數(shù)據(jù)庫進(jìn)行手工注入,或者直接使用自動(dòng)注入工具進(jìn)行SQL注入,以破壞該網(wǎng)站數(shù)據(jù)信息的“CIA”三要素。
3.QL注入的防御及數(shù)據(jù)庫訪問控制
SQL注入攻擊嚴(yán)重威脅著數(shù)據(jù)庫的安全,因此,在web應(yīng)用程序設(shè)計(jì)和編寫的時(shí)候必須采用必要的防護(hù)手段,避免數(shù)據(jù)庫中的重要信息被網(wǎng)絡(luò)中的不法分子竊取。我們可以通過以下三種常見方法對(duì)SQL注入攻擊進(jìn)行防御。
3.1輸入驗(yàn)證防御。
輸入驗(yàn)證一般分為白名單驗(yàn)證和黑名單驗(yàn)證兩種方式。白名單驗(yàn)證首先建立起白名單規(guī)則,即確定包含在規(guī)則內(nèi)的數(shù)據(jù)全部通過,否則便丟棄或拒絕訪問;黑名單驗(yàn)證正好相反,首先建立黑名單規(guī)則,在規(guī)則內(nèi)的數(shù)據(jù)禁止通過。白名單驗(yàn)證的防護(hù)強(qiáng)度一般高于黑名單驗(yàn)證,在較為重要的數(shù)據(jù)庫上都應(yīng)該建立白名單規(guī)則。
代碼實(shí)現(xiàn)的功能非常簡單,就是對(duì)用戶輸入的用戶名和密碼的數(shù)據(jù)類型和字符串長度進(jìn)行校驗(yàn)。如果用戶輸入了不滿足校驗(yàn)要求的數(shù)據(jù),比如“and1=1”、“'or‘1’=’1’”等常見的登錄SQL注入代碼,就會(huì)提示錯(cuò)誤并拒絕請(qǐng)求。這樣就避免了帶有SQL注入功能的SQL語句被送至數(shù)據(jù)庫服務(wù)器中執(zhí)行,即在數(shù)據(jù)庫服務(wù)器以外就將不合法的輸入拒絕掉。
3.2代碼過濾防御。
SQL注入產(chǎn)生的根本原因是不法用戶修改了程序員預(yù)先設(shè)計(jì)好的SQL語句結(jié)構(gòu)。根據(jù)前文的內(nèi)容可以發(fā)現(xiàn),SQL注入語句基本都包含得有各種非法字符串、數(shù)字和符號(hào)。如果我們通過編寫特定代碼,將用戶提交的數(shù)據(jù)表單中不合法的內(nèi)容過濾掉,即可有效避免SQL注入攻擊。但是,在過濾的時(shí)候必須遵循一定的原則,不能錯(cuò)將原本合法的SQL語句中的字符也過濾掉,否則將無法實(shí)現(xiàn)web應(yīng)用程序的基本功能。比如在所有SQL注入中都存在“空格”符號(hào),但是卻不能簡單粗暴地把用戶提交的數(shù)據(jù)中的空格都過濾掉,因?yàn)樵谟⑽淖址?,空格本身就是合法輸入的一部分。我們通常的做法是用“{#space}”來替換用戶輸入的空格,在瀏覽器呈現(xiàn)數(shù)據(jù)之前再進(jìn)行反替換。
4.結(jié)束語
本文就數(shù)據(jù)庫安全基本要求、SQL注入的基本原理和防護(hù)手段進(jìn)行了討論。SQL語句作為關(guān)系型數(shù)據(jù)庫的核心執(zhí)行代碼,長期以來都面臨這巨大的網(wǎng)絡(luò)安全挑戰(zhàn),網(wǎng)絡(luò)安全從業(yè)人員必須緊隨時(shí)代發(fā)展趨勢和不斷變化的安全需求,不斷推進(jìn)數(shù)據(jù)庫安全性的提升。
參考文獻(xiàn):
[1] HE Guiying, ZHOU jie, WANG lv.Database Security Technology. (2017)321740.
[2] Abraham Silberschatz, Henry F.Korth, S.Sudarshan. Database System Concepts.01-2010-3824.
[3] Ma jun, Duan xinglin. Analysis and prevention of SQL injection in Web application system.1009-2552(2015) 08-0071-0。10.13274 /j. cnki. hdzj.2015.08.019.
[4] Wu Pufeng, Zhang yuqing. An Overview of Database Security. 1000—3428(2006)12—0085—04。TP309.2.2006-6.
(廣安職業(yè)技術(shù)學(xué)院)