安全程序設(shè)計(jì):05 輸入安全_第1頁
安全程序設(shè)計(jì):05 輸入安全_第2頁
安全程序設(shè)計(jì):05 輸入安全_第3頁
安全程序設(shè)計(jì):05 輸入安全_第4頁
安全程序設(shè)計(jì):05 輸入安全_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第五章輸入安全 輸入操作是用戶和軟件交互的手段,因此,輸入時(shí)的數(shù)據(jù)安全保證顯得非常重要。本章針對(duì)幾個(gè)常見的輸入安全問題進(jìn)行討論首先是傳統(tǒng)的輸入問題。了解輸入安全的基本概念和基本意義;總體意義上的不正確輸入的預(yù)防措施和預(yù)防策略。接下來針對(duì)幾個(gè)典型問題:數(shù)字輸入安全、字符串輸入安全、環(huán)境變量安全等;最后對(duì)文件名安全進(jìn)行了介紹另外是數(shù)據(jù)庫輸入安全的若干話題。首先對(duì)數(shù)據(jù)庫應(yīng)用進(jìn)行了簡(jiǎn)單介紹,然后針對(duì)數(shù)據(jù)庫的惡意輸入進(jìn)行了分析,并提出了幾種簡(jiǎn)單的解決方案;接下來對(duì)賬戶和口令等問題進(jìn)行了描述,也提出了解決的方法不過,實(shí)際的軟件工程過程中,輸入方面的隱患可能表現(xiàn)在很多方面,本章的內(nèi)容不可能涵蓋所有的方面,因

2、此,需要用戶針對(duì)具體情況提出相應(yīng)的解決方案。5.1 輸入安全5.1.1 輸入安全概述輸入是一個(gè)很廣泛的概念,既是用戶和軟件之間的交互手段,也是軟件內(nèi)部模塊之間的交互手段。針對(duì)軟件用戶的輸入有很多類型,如:用戶在軟件上輸入一個(gè)命令,進(jìn)行相應(yīng)操作;用戶輸入自己的賬號(hào)密碼,進(jìn)行登錄驗(yàn)證;用戶輸入一個(gè)關(guān)鍵字,進(jìn)行查詢;等等模塊之間進(jìn)行數(shù)據(jù)傳遞時(shí),也會(huì)有相應(yīng)輸入,如:一個(gè)模塊調(diào)用另一個(gè)模塊時(shí),輸入一些參數(shù);一個(gè)模塊讀取一個(gè)配置文件,來對(duì)自己的行為進(jìn)行配置;等等從程序本身的角度講,很多情況下,軟件的安全問題就出在輸入;從攻擊者的角度講,輸入是進(jìn)行攻擊的重要手段經(jīng)過調(diào)查總結(jié),我們認(rèn)為,大部分的軟件安全問題來

3、源于:應(yīng)用程序接受輸入數(shù)據(jù)前,沒有進(jìn)行安全性驗(yàn)證提示:這里所說的安全性驗(yàn)證,還不僅僅是傳統(tǒng)的合法性驗(yàn)證。傳統(tǒng)的合法性驗(yàn)證只是需要對(duì)格式是否合法等問題進(jìn)行簡(jiǎn)單的驗(yàn)證,而這里的安全性驗(yàn)證還必須針對(duì)安全問題進(jìn)行相應(yīng)的檢查。下面舉一個(gè)例子來說明這個(gè)問題。如代碼hello.p ,是一個(gè)Linux的Shell腳本,在Linux下,可以用任意編輯器編寫將該代碼保存為在Linux下,并賦予執(zhí)行權(quán)限,然后進(jìn)入Linux的Shell命令行,運(yùn)行該程序: 上面的斜體“Tom”,表示用戶的輸入。從上面的內(nèi)容可以看出,輸入“Tom”之后,程序顯示: $ ./hello.p Please input your name:

4、 Tom Hello Tom How do you do? Good bye 運(yùn)行正常。但是該程序如果這樣輸入: 則顯示: Hello Tom How do you do? Good bye $ ./hello.p Whats your name Tom;ls; Hello Tom cams.tar.gz hello.p helloapp.c hellod.cpp test1.cpp test.c test2.cpp test2.p How do you do? Good bye 我們都知道,ls是linux中列出當(dāng)前目錄下所有文件的命令。從上面的結(jié)果可以看出,ls命令在輸入時(shí)被帶進(jìn)去了,這樣

5、,程序就會(huì)顯示當(dāng)前目錄下的所有文件很明顯,如果任由用戶輸入而不進(jìn)行檢查,用戶就可以輸入其他對(duì)系統(tǒng)有害的命令,如rm(刪除)命令,那帶來的危害是巨大的因此,該代碼是不安全的解決上面問題的方法顯然是進(jìn)行安全性驗(yàn)證。一句話,對(duì)于編程人員來說,程序的所有輸入數(shù)據(jù),在被進(jìn)行安全性驗(yàn)證之前,都必須要被認(rèn)為是有害的。一旦忽略了這條規(guī)則,程序就可能遭受攻擊以上規(guī)則說起來很容易,也容易理解,但是在傳統(tǒng)情況下,安全性驗(yàn)證往往被忽略掉。其主要原因是:1:在同一軟件中,由于每一個(gè)輸入到達(dá)最后的執(zhí)行模塊的過程中,都需要經(jīng)過許多關(guān)口,每個(gè)關(guān)口都有可能進(jìn)行檢查。但就是因?yàn)檫@樣,許多的開發(fā)人員都回避對(duì)輸入的檢查,因?yàn)樗麄円话?/p>

6、假定這些數(shù)據(jù)在通過其他關(guān)口時(shí),已經(jīng)由其他關(guān)口的應(yīng)用程序函數(shù)檢查過了,他們不愿意犧牲性能去對(duì)數(shù)據(jù)進(jìn)行多次校驗(yàn)。結(jié)果導(dǎo)致大家都沒有進(jìn)行驗(yàn)證2:隨著軟件的分工,現(xiàn)在許多應(yīng)用程序的功能都分塊分布在不同的機(jī)器上(如客戶機(jī)器和服務(wù)器上,或者對(duì)等機(jī)器上),開發(fā)人員有充足理由依賴應(yīng)用程序的其他模塊提供安全的檢驗(yàn)但是從上面的例子我們又可以看出,輸入安全解決不好,在嚴(yán)重的情況下,可能會(huì)帶來巨大的危害提示性能和安全相比,顯得太渺小了用戶寧可使用一個(gè)運(yùn)行緩慢而安全的系統(tǒng),也不會(huì)使用一個(gè)響應(yīng)很快卻很容易受到攻擊的系統(tǒng)提示 :下面給出一個(gè)輸入安全的案例。2003年7月,計(jì)算機(jī)應(yīng)急反應(yīng)小組協(xié)調(diào)中心報(bào)告了Microsoft

7、Windows的DirectX MIDI庫中一組危險(xiǎn)的漏洞。 DirectXMIDI庫是用于播放MIDI格式音樂的底層Windows庫。但是這個(gè)庫沒有去檢查 MIDI 文件中的所有數(shù)據(jù)值:如text、copyright和其他域中的數(shù)據(jù),而用戶如果輸入錯(cuò)誤的值,則可能導(dǎo)致這個(gè)庫的失效 攻擊者可以利用這一漏洞讓系統(tǒng)去執(zhí)行他們想要執(zhí)行的任何代碼。其方法為:發(fā)布一個(gè)網(wǎng)頁,當(dāng)用戶察看這個(gè)網(wǎng)頁時(shí),相當(dāng)于用戶在執(zhí)行本地DirectX MIDI庫中的內(nèi)容;因?yàn)?Internet Explorer在察看一個(gè)包含MIDI文件鏈接的網(wǎng)頁時(shí),會(huì)自動(dòng)加載那個(gè)文件并播放它。因此,攻擊者如果輸入設(shè)計(jì)足夠精巧,則可以利用這個(gè)

8、庫的漏洞來做很多事情,如: 刪除用戶計(jì)算機(jī)的所有文件; 將用戶的一些機(jī)密文件通過電子郵件發(fā)送到攻擊者的郵箱; 讓機(jī)器崩潰;等等5.1.2 預(yù)防不正確的輸入很明顯,要想防御應(yīng)用程序可能受到的輸入攻擊,最簡(jiǎn)單且最有效的方法是:在對(duì)輸入進(jìn)行任何一步處理之前,必須要對(duì)數(shù)據(jù)安全進(jìn)行驗(yàn)證數(shù)據(jù)安全驗(yàn)證,說起來比較容易,做起來要考慮很多問題。并且就是因?yàn)楸缓芏嘬浖_發(fā)者感覺太容易了,反而會(huì)忽略科學(xué)的方法數(shù)據(jù)安全驗(yàn)證的一般步驟如下:1:對(duì)安全的輸入加以定義。所有的輸入設(shè)計(jì)都應(yīng)該有一個(gè)安全定義,在這個(gè)安全定義內(nèi),數(shù)據(jù)被認(rèn)為是格式正確的,并且是安全的。輸入的數(shù)據(jù)一旦符合這個(gè)安全定義,或者說在這個(gè)安全定義的邊界內(nèi),就

9、認(rèn)為不必要進(jìn)行檢查了2:對(duì)輸入的數(shù)據(jù),針對(duì)前面的定義,進(jìn)行檢查。一般情況下,可在對(duì)任何資源的訪問之前設(shè)置一個(gè)檢查模塊,對(duì)輸入數(shù)據(jù)進(jìn)行檢查,設(shè)計(jì)過程中,如果輸入數(shù)據(jù)沒有經(jīng)過這個(gè)檢查模塊,就無法訪問資源可以設(shè)置多個(gè)檢查模塊,每個(gè)數(shù)據(jù)源(如網(wǎng)頁、注冊(cè)表、文件系統(tǒng)、配置文件等)都有一個(gè)檢查模塊。如圖所示:提示:如果機(jī)器上有有些模塊要進(jìn)行統(tǒng)一的檢查,那也沒有必要每個(gè)模塊進(jìn)行一個(gè)檢查。可以通過一些手段進(jìn)行統(tǒng)一的檢查。比如,在Web中,修改資料、查看日志、購買物品的頁面,只有登陸成功之后才能訪問,我們要對(duì)某些頁面進(jìn)行session檢查,來決定它們是否能夠被請(qǐng)求。這時(shí)可以在每個(gè)頁面上編寫session檢查的代

10、碼,但也可以通過過濾器進(jìn)行解決。結(jié)構(gòu)如下: 在對(duì)輸入進(jìn)行檢查時(shí),為了保證實(shí)際工作的可行性,在設(shè)計(jì)時(shí),可以采用以下幾個(gè)策略: 盡量讓程序可以輸入的入口少一些。這樣的話,如果程序分為若干個(gè)模塊,那么攻擊者直接和某些模塊通信的概率大大減小,也就是說,攻擊者進(jìn)入程序的途徑將大大減少,同時(shí)也限制了它們對(duì)各模塊之間的通信路徑進(jìn)行攻擊的可能。安全驗(yàn)證的代價(jià)大大減小盡量讓輸入所允許的輸入類型少一些。這樣可以讓驗(yàn)證的工作更加簡(jiǎn)化。比如,如果僅僅允許輸入的值為數(shù)字,那么驗(yàn)證時(shí)只需要針對(duì)數(shù)字進(jìn)行驗(yàn)證,驗(yàn)證是相對(duì)簡(jiǎn)單的;如果將輸入設(shè)計(jì)為任何字符串都可以輸入,那么將要考慮更多的問題,驗(yàn)證難度將會(huì)增加很多嚴(yán)格檢查不可信的

11、輸入。不僅在數(shù)據(jù)最初進(jìn)入程序時(shí)要執(zhí)行檢查,而且在程序?qū)嶋H使用這些數(shù)據(jù)時(shí),也要進(jìn)行檢查。當(dāng)然,檢查的項(xiàng)目可以不一樣,但是檢查應(yīng)該是時(shí)時(shí)存在的。不過,相對(duì)來說,更重要的是數(shù)據(jù)在使用之前的檢查。一般情況下,我們可以采用如下方法:一個(gè)數(shù)據(jù)在進(jìn)入模塊時(shí),在各個(gè)模塊內(nèi)進(jìn)行針對(duì)該模塊的安全檢查,如圖所示: 轉(zhuǎn)變觀念,從定義“非法”到定義“合法”安全程序開發(fā)人員往往有個(gè)誤區(qū),它們首先定義的是“什么樣的數(shù)據(jù)非法?”,這個(gè)定義很容易下,比如,email中可以定義沒有“”符號(hào)為非法,但是這是不安全的。因?yàn)椴豢赡軐⑺蟹欠ǖ臄?shù)據(jù)都加以定義,攻擊者非常聰明,他們常常會(huì)想到出其他的非法數(shù)據(jù)。定義“什么是非法”,容易想到,

12、但是無法定義全;但是定義“什么是合法”,就相對(duì)容易得多?!罢_答案只有幾個(gè),而錯(cuò)誤答案可以千千萬”,就是這個(gè)道理 所以應(yīng)該做的是確定“什么樣的數(shù)據(jù)是合法的? ”在數(shù)據(jù)輸入時(shí),檢查數(shù)據(jù)是否符合定義,拒絕所有不符合定義的數(shù)據(jù);而不是檢查數(shù)據(jù)是否不符合定義,接受符合定義的數(shù)據(jù)例如,有一個(gè)程序,根據(jù)用戶的輸入,創(chuàng)建一個(gè)文件。很顯然,有些字符,如“/”,是不允許的。但是僅僅去檢查這一個(gè)字符也不夠,其他字符,比如,控制字符、空格、橫線等,都有可能不合法。即使創(chuàng)建了一個(gè)“非法”字符的列表,也可能沒有辦法定義完全,因?yàn)榭傆锌赡苡袥]有考慮到的情況因此,正確的方法應(yīng)該是:確定文件名輸入的一個(gè)安全的特定格式,而拒絕

13、不符合這個(gè)特定格式的所有輸入5.2 幾種典型的輸入安全5.2.1 數(shù)字輸入安全數(shù)字的輸入安全,是比較常見的。比如我們?cè)诒韱紊陷斎胍粋€(gè)人的年齡,一般就會(huì)有范圍限制。對(duì)數(shù)字的安全檢查主要有: 格式,如整數(shù)、小數(shù)等; 精度,如小數(shù)保留的位數(shù)等; 范圍,如某個(gè)輸入數(shù)字的大小取值范圍等; 類型和范圍的匹配,如為了預(yù)防整數(shù)溢出,對(duì)短整數(shù)的輸入進(jìn)行范圍檢查;等等。針對(duì)數(shù)字輸入的安全要注意以下幾點(diǎn): 將數(shù)字格式進(jìn)行確定。比如,有的系統(tǒng)中數(shù)字是阿拉伯?dāng)?shù)字,也有的系統(tǒng)支持中文數(shù)字(如一二三,甚至壹貳叁等)輸入,有的系統(tǒng)中數(shù)字每三位就有一個(gè)“,”,等等。一般情況下,可以用正則表達(dá)式來進(jìn)行驗(yàn)證字符串是否是數(shù)字,然后進(jìn)

14、行數(shù)字的安全檢查提示在編寫應(yīng)用程序的過程中,經(jīng)常要判斷某些字符串是否符合某些復(fù)雜規(guī)則,正則表達(dá)式就是用于描述這些規(guī)則的工具。換句話說,正則表達(dá)式就是記錄和幫助判斷文本規(guī)則的代碼例如:A-Za-z0-9+$ 指定字符串至少為一個(gè)字符長(zhǎng),而且只能包括大寫字母、小寫字母和阿拉伯?dāng)?shù)字0到9(任意的順序); 又如:0d2-d8|0d3-d7這個(gè)表達(dá)式能匹配兩種以“-”分隔的電話號(hào)碼:一種是三位區(qū)號(hào),8位本地號(hào)(,一種是4位區(qū)號(hào),7位本地號(hào)(。大量的語言,如C、Java、Perl、Javascript等,都支持正則表達(dá)式,它們對(duì)表達(dá)式的定義基本相同,

15、但是也有細(xì)微的差別關(guān)于正則表達(dá)式,大家可以針對(duì)某一種語言,參考相關(guān)文檔 對(duì)于負(fù)數(shù)的驗(yàn)證。一般最好不要根據(jù)有沒有符號(hào)位來確定該數(shù)是不是負(fù)數(shù)。因?yàn)橛行┏绦蛑?,如果輸入一個(gè)很大的正數(shù),也可能導(dǎo)致數(shù)值“溢出”而變成一個(gè)負(fù)數(shù),而要進(jìn)行一些底層的判斷特別要注意判斷數(shù)值溢出(如整數(shù)溢出)的問題 5.2.2 字符串輸入安全字符串輸入的安全性,也是很重要的。根據(jù)前面的原則,一般情況下,要確定合法的字符串,拒絕所有其他的字符串;而不是確定非法的字符串,接受所有其他的字符串同樣,指定合法字符串最簡(jiǎn)單的方法是使用正則表達(dá)式,這種情況下,只需要正確使用正則表達(dá)式,描述合法字符串的模式,判斷輸入的字符串是否符合這個(gè)模式,

16、拒絕不符合這個(gè)模式的數(shù)據(jù)關(guān)于對(duì)字符串的驗(yàn)證,有以下問題值得注意: 如果使用正則表達(dá)式,最好明確地指出要匹配數(shù)據(jù)的的開始(通常用來標(biāo)識(shí))和結(jié)束(通常用$來標(biāo)識(shí))。否則,攻擊者可能在輸入中嵌入攻擊文本,并且能夠繞過安全檢查盡可能在輸入中拒絕特殊字符。因?yàn)橛泻芏嗵厥庾址谀承┫到y(tǒng)下?lián)碛刑厥獾暮x,如“”,在windows系統(tǒng)中可能作為文件路徑分隔符。在開發(fā)階段這個(gè)問題可能不容易引起注意,但是可能會(huì)被攻擊者利用這些字符可能包括以下幾類: 常規(guī)特殊字符,一般在ASCII碼表內(nèi),但是由于有時(shí)候會(huì)用來表達(dá)特定含義,如$、%、*、0、n等;攻擊者可能用數(shù)字代替這個(gè)字符來進(jìn)行輸入,達(dá)到攻擊的目的; 不在ASCI

17、I碼表內(nèi),字符值大于127的國(guó)際化的字符,也可能會(huì)有許多可能的含義。例如,UTF-8 編碼的字符,用兩個(gè)字節(jié)進(jìn)行編碼,有些特殊字符也可以在該字符集里面進(jìn)行表達(dá),盡量不要使用; 和某些特定應(yīng)用有關(guān)的字符或者字符串。如shell中的命令名稱,如(rm、ls、mount)、SQL中的關(guān)鍵詞或者關(guān)鍵字符(如select、注釋符號(hào)-、單引號(hào)、exec)等在程序中有特定含義的字符。如某些系統(tǒng)中,將系統(tǒng)的配置信息用“#”隔開之后保存在配置文件內(nèi),這不是一個(gè)規(guī)定,但是可由軟件的開發(fā)者在程序中自行確定;又如,在XML和HTML中用“”表示節(jié)點(diǎn),這些字符都不應(yīng)該在合法范圍之內(nèi)5.2.3 環(huán)境變量輸入安全在操作系統(tǒng)

18、中,環(huán)境變量是交互環(huán)境(shell)中的變量,在該交互環(huán)境(shell)下運(yùn)行的進(jìn)程,可以訪問環(huán)境變量并修改其值環(huán)境變量在同一個(gè)交互環(huán)境下只有一個(gè)實(shí)例。不同的交互環(huán)境有不同的實(shí)例,互不干擾。其功能是用于影響該環(huán)境下進(jìn)程的行為例如,在linux中,輸入env命令,就可以看到系統(tǒng)中的環(huán)境變量。它們以:“變量名=值”的形式出現(xiàn)。在windows中,輸入set命令,也可以看到系統(tǒng)中的環(huán)境變量。如: 環(huán)境變量的輸入可能給攻擊者帶來機(jī)會(huì)。主來源于: 環(huán)境變量的輸入可能給攻擊者帶來機(jī)會(huì)。主要來源于:環(huán)境變量的內(nèi)容給攻擊者以機(jī)會(huì)有些系統(tǒng)中,環(huán)境變量存儲(chǔ)了和系統(tǒng)有關(guān)的一些配置信息,如在Linux中,很多程序配置

19、被環(huán)境變量以某些隱含、模糊或未公開的方式所定義。例如,sh和bash shell使用IFS變量來決定分隔命令行參數(shù)的字符。那么,在執(zhí)行一個(gè)shell時(shí),把IFS設(shè)置為某些值,就可能進(jìn)行攻擊另一方面,由于并不是所有的環(huán)境變量都有文檔的說明,這讓用戶遇到攻擊之后無所適從;并且由于環(huán)境變量的可編輯性,攻擊者甚至可以增加一些更加危險(xiǎn)的環(huán)境變量,來達(dá)到攻擊的目的環(huán)境變量的存儲(chǔ)格式給攻擊者機(jī)會(huì)在Linux下,環(huán)境變量在底層,通常是以字符串?dāng)?shù)組形式存儲(chǔ)的,這個(gè)字符串指針數(shù)組有一個(gè)頭指針,該數(shù)組中,按順序存儲(chǔ)各個(gè)環(huán)境變量,每一個(gè)環(huán)境變量是這個(gè)數(shù)組中的一個(gè)元素,該數(shù)組以NULL指針結(jié)尾。每一個(gè)元素的格式都為:“

20、NAME=value”這就潛在地說明,環(huán)境變量名不能包含等號(hào),也不能包含一些其他敏感符號(hào),如NIL(ASCII碼為0的字符,一般表示一個(gè)字符串結(jié)尾)。但是如果這一點(diǎn)被攻擊者利用,也會(huì)給系統(tǒng)帶來損害實(shí)際上,環(huán)境變量方面的安全問題還有很多,讀者可以參考相關(guān)文檔 如何解決以上安全問題?可從以下幾個(gè)方面著手: 限制環(huán)境變量的使用權(quán)限; 可適當(dāng)破壞環(huán)境變量在shell之間的共享; 用戶定義的環(huán)境變量,需要進(jìn)行嚴(yán)格的檢查5.2.4 文件名安全在很多和文件輸出有關(guān)的系統(tǒng)中,文件名有可能成為安全隱患。無論在什么樣的操作系統(tǒng)中,文件名應(yīng)該遵循以下安全準(zhǔn)則:最好不要讓用戶來自己輸入文件名,應(yīng)該在界面上給用戶一個(gè)默

21、認(rèn)的文件名。如windows中將文件另存時(shí),界面中“文件名”框中,會(huì)顯示一個(gè)默認(rèn)的合法名稱,避免用戶因?yàn)檩斎胍恍┎缓戏ǖ奈募斐砂踩珕栴}。 如果不得不讓用戶輸入文件名,那么最好將文件名限制只能含有字母和數(shù)字。特別應(yīng)該考慮將一些特殊字符如“/”、“”、“-”、“.”和通配符(如“*”、“?”、“” 和“”)等這些字符從合法模式中去掉。例如,如果文件名中可以用“-”,有一個(gè)文件名為“-rf”,那么在 UNIX/Linux 中執(zhí)行命令“rm *”,將會(huì)變成執(zhí)行“rm -rf”。這實(shí)際上是一個(gè)安全隱患。不要允許用戶命名一些可能和物理設(shè)備沖突的文件名。比如,在一些系統(tǒng)中,一些文件名可以被認(rèn)為是物理設(shè)備

22、例如,如果一個(gè)程序試圖去打開“COM1”文件,可能被系統(tǒng)誤解為是嘗試和串口通信,系統(tǒng)就去進(jìn)行串口的讀寫,而該操作又不是用戶的期望。因此,該種文件命名也要避免5.3 數(shù)據(jù)庫輸入安全5.3.1 數(shù)據(jù)庫概述數(shù)據(jù)庫(Database,DB),顧名思義,是存放數(shù)據(jù)的地方。在計(jì)算機(jī)中,數(shù)據(jù)庫包括兩個(gè)方面的含義:數(shù)據(jù)本身和數(shù)據(jù)庫對(duì)象。不同的數(shù)據(jù)庫產(chǎn)品,對(duì)數(shù)據(jù)都有不同的定義,但是展現(xiàn)給用戶的數(shù)據(jù)庫對(duì)象都類似,主要有: 表(Table); 視圖(View); 存儲(chǔ)過程(Stored Procedure); 觸發(fā)器(Trigger);等等其中,表是最常用、最基本的數(shù)據(jù)庫對(duì)象。關(guān)于這些數(shù)據(jù)庫對(duì)象的定義,大家可以參考

23、相關(guān)文檔數(shù)據(jù)庫一般用數(shù)據(jù)庫管理系統(tǒng)(DBMS)類進(jìn)行管理,數(shù)據(jù)庫管理系統(tǒng)是用于管理數(shù)據(jù)的計(jì)算機(jī)軟件。利用數(shù)據(jù)庫管理系統(tǒng),用戶能方便地定義和操縱數(shù)據(jù),維護(hù)數(shù)據(jù)的安全性和完整性,以及進(jìn)行多用戶下的并發(fā)控制和恢復(fù)數(shù)據(jù)庫,一般情況下,我們所說的“數(shù)據(jù)庫軟件”就是指數(shù)據(jù)庫管理系統(tǒng)目前,常用的數(shù)據(jù)庫管理系統(tǒng)有Access,Oracle,Sybase,F(xiàn)oxPro,DB2,Informix,SQL Server等,它們?cè)诟鞣N聯(lián)機(jī)事務(wù)處理、數(shù)據(jù)倉庫、電子商務(wù)、信息管理系統(tǒng)、決策支持系統(tǒng)、辦公自動(dòng)化系統(tǒng)、企業(yè)資源計(jì)劃、網(wǎng)站建設(shè)等方面都有著廣泛的應(yīng)用5.3.2 數(shù)據(jù)庫的惡意輸入攻擊者通過對(duì)數(shù)據(jù)庫的惡意輸入,可以將

24、信息注入正在運(yùn)行的流程,獲取敏感數(shù)據(jù),甚至危害進(jìn)程的運(yùn)行狀態(tài)例如以下常見代碼: 變量name是由用戶提供。這個(gè)SQL語句看上去沒有問題,如果用戶的輸入為name=Tom,它將創(chuàng)建完整、良好的SQL語句: 這很正常。但是這可能會(huì)給用戶惡意輸入的機(jī)會(huì)。該SQL語句的問題在于攻擊者可在變量name中植入SQL語句。如果用戶的輸入為:TomOR 1=1 -,語句變?yōu)椋哼@條語句將返回表T_CUSTOMER列NAME值為Tom的行,或者所有滿足1=1子句的行。而對(duì)于表中的每一行,1=1都返回true,因此表中的所有行都將被返回,此種情況下,攻擊者將能夠獲得表T_CUSTOMER中所有數(shù)據(jù)String sq

25、l = SELECT * FROM T_CUSTOMER WHERE NAME= + name + ; SELECT * FROM T_CUSTOMER WHERE NAME=Tom SELECT * FROM T_CUSTOMER WHERE NAME=Tom OR 1=1 -攻擊者通過這種技術(shù),可以完成以下攻擊活動(dòng): 改變一條SQL語句的具體條件; 添加并且運(yùn)行額外的SQL的語句;秘密調(diào)用函數(shù)和存儲(chǔ)過程 在有些數(shù)據(jù)庫產(chǎn)品中允許一次性運(yùn)行多條語句,這給攻擊者更大的攻擊空間。如上面的例子,如果攻擊者輸入:Tom; DROP TABLE T_CUSTOMER -,語句變?yōu)椋哼@條語句將返回表T_CUSTOMER列NAME值為Tom的行,然后刪除T_CUSTOMER表。此外,這種攻擊還包括各種可以改變數(shù)據(jù)庫結(jié)構(gòu)的操作,例如創(chuàng)建、刪除、以及更新數(shù)據(jù)庫對(duì)象等。關(guān)于SQL注入的解決方法,我們將在第9章進(jìn)行詳細(xì)分析SELECT * FROM T_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論