本發(fā)明涉及信息安全領(lǐng)域,具體而言,本發(fā)明涉及一種sql注入攻擊防御組件及方法。
背景技術(shù):
::在當(dāng)今網(wǎng)絡(luò)環(huán)境下,數(shù)據(jù)庫作為重要的存儲工具,經(jīng)常存儲著大量有價值的數(shù)據(jù),這些數(shù)據(jù)包含用戶信息、企業(yè)數(shù)據(jù)、金融財政、商業(yè)機密、知識產(chǎn)權(quán)、客戶訂單信息等內(nèi)容,其重要程度不言而喻。因此,數(shù)據(jù)庫往往會成為網(wǎng)絡(luò)黑客的主要攻擊對象。網(wǎng)絡(luò)黑客利用各種途徑、各種攻擊工具、各種欺騙手段來獲取其想得到的信息,因此,保證數(shù)據(jù)庫安全變得非常重要。最常見的數(shù)據(jù)庫安全威脅是結(jié)構(gòu)化查詢語言(structuredquerylanguage,簡稱sql)注入攻擊,sql注入攻擊指的是通過構(gòu)建特殊的輸入語句傳入web應(yīng)用服務(wù)器,而這些輸入語句包含sql語法里的一些關(guān)鍵詞,通過使web應(yīng)用執(zhí)行sql語句進而執(zhí)行攻擊者所要的操作。這是由于系統(tǒng)應(yīng)用未對客戶端輸入語句進行合法性檢查,攻擊者可以通過提交一段數(shù)據(jù)庫查詢代碼,根據(jù)應(yīng)用返回的結(jié)果,獲得某些想得知的數(shù)據(jù)。針對sql注入攻擊,傳統(tǒng)解決方案絕大多數(shù)是在系統(tǒng)被攻擊之后的“亡羊補牢”式防護,但在系統(tǒng)出現(xiàn)新的注入攻擊點時,仍然束手無策。具體來說,傳統(tǒng)防御技術(shù)都是基于黑名單對客戶端輸入語句進行合法性檢查,當(dāng)發(fā)現(xiàn)客戶端的輸入語句在黑名單內(nèi),則對其進行攔截,進而實現(xiàn)基于已知注入漏洞的sql注入防御。該方案存在以下兩方面的嚴(yán)重問題:1)對于未知注入漏洞無能為力;2)黑名單過多會產(chǎn)生高誤報問題,進而影響正常用戶使用。針對數(shù)據(jù)庫sql注入攻擊威脅,申請?zhí)枮?00910206715.1的中國發(fā)明專利公開了一種sql注入攻擊檢測方法及其裝置,該專利是基于惡意人員進行sql注入攻擊的行為特征,對用戶發(fā)送的請求訪問動態(tài)網(wǎng)頁的請求消息中攜帶的sql注入關(guān)鍵字進行累計計數(shù),規(guī)定時間長度內(nèi),當(dāng)與該用戶發(fā)送該請求消息時使用的訪問屬性信息相應(yīng)的sql注入累計值達(dá)到限定值時,認(rèn)定該用戶正在對網(wǎng)站實施sql注入攻擊,雖然在一定程度上克服了傳統(tǒng)sql檢測機制的缺陷,緩解了傳統(tǒng)sql注入攻擊檢測方法中存在高誤報率的問題,但其對未知攻擊行為的防御能力仍然無能為力。申請?zhí)枮?00710121668.1的中國發(fā)明專利公開了一種支持多種數(shù)據(jù)庫類型的sql注入攻擊檢測系統(tǒng),其通過使用sql注入命令的內(nèi)在語法結(jié)構(gòu)來定義sql注入攻擊檢測規(guī)則,而不是基于傳統(tǒng)入侵檢測系統(tǒng)的攻擊特征簽名來定義sql注入攻擊檢測規(guī)則,有效克服了sql注入攻擊事件的攻擊特征簽名不易提取和易被欺騙等缺點,但是該發(fā)明仍然是一種基于已知攻擊行為特征的防御手段,對含有未知特征sql注入攻擊無效。技術(shù)實現(xiàn)要素:為了解決現(xiàn)有對于含有未知特征的sql注入攻擊無效的問題,本發(fā)明提供了一種sql注入攻擊防御組件及方法。為了本實現(xiàn)上述目的,本發(fā)明一方面提供一種sql注入攻擊防御組件,其與一應(yīng)用服務(wù)器相連,該sql注入攻擊防御組件包括:sql語句預(yù)處理模塊,其設(shè)置為使應(yīng)用服務(wù)器輸出的sql語句中的所有sql關(guān)鍵詞分別帶上預(yù)生成的標(biāo)簽;用戶輸入?yún)?shù)處理模塊,其設(shè)置為將用戶輸入的參數(shù)添加到經(jīng)過所述sql語句預(yù)處理模塊處理后的sql語句中;注入攻擊檢測模塊,其設(shè)置為檢測經(jīng)過所述用戶輸入?yún)?shù)處理模塊處理后的sql語句中的所有關(guān)鍵字是否均帶有合法的標(biāo)簽,合法是指與sql語句預(yù)處理模塊中添加的標(biāo)簽相同;以及注入檢測結(jié)果生成模塊,其設(shè)置為根據(jù)所述注入攻擊檢測模塊的檢測結(jié)果返回相應(yīng)的信息,若所述注入攻擊檢測模塊檢測到sql語句中的所有關(guān)鍵詞均帶有合法的標(biāo)簽,則將該sql語中的標(biāo)簽去除后返回至應(yīng)用服務(wù)器,否則,返回指令錯誤信息。優(yōu)選地,所述sql語句預(yù)處理模塊還設(shè)置為對應(yīng)用服務(wù)器輸出的sql語句進行復(fù)制,以生成至少兩條相同的sql語句,并將復(fù)制生成的至少兩條sql語句作為子語句拼接成一條組合的sql語句,然后使所述組合的sql語句中的所有關(guān)鍵詞均帶上預(yù)生成的標(biāo)簽,其中相同子語句中的關(guān)鍵詞帶有相同的標(biāo)簽,不同子語句中的關(guān)鍵詞帶有不同的標(biāo)簽。優(yōu)選地,所述注入攻擊檢測模塊還設(shè)置為檢測組合的sql語句的每條子語句中的標(biāo)簽是否與所述sql語句預(yù)處理模塊添加的標(biāo)簽一致,若一致,則所述注入檢測結(jié)果生成模塊選擇任意一條子語句將其中的標(biāo)簽去除后返回至應(yīng)用服務(wù)器,否則,返回所述指令錯誤信息。優(yōu)選地,所述預(yù)生成的標(biāo)簽隨機生成。優(yōu)選地,所述預(yù)生成的標(biāo)簽根據(jù)用戶的指紋信息生成。優(yōu)選地,所述預(yù)生成的標(biāo)簽按周期變化。本發(fā)明另一方面提供一種sql注入攻擊防御方法,包括以下步驟:s1,使應(yīng)用服務(wù)器輸出的sql語句中的所有sql關(guān)鍵詞分別帶上預(yù)生成的標(biāo)簽;s2,將用戶輸入的參數(shù)添加到經(jīng)過所述步驟s1處理后的sql語句中;s3,檢測經(jīng)過所述步驟s2處理后的sql語句中的所有關(guān)鍵字是否均帶有合法的標(biāo)簽,合法是指與所述步驟s1中添加的標(biāo)簽相同;以及s4,根據(jù)所述步驟s3的檢測結(jié)果返回相應(yīng)的信息,若所述步驟s3檢測到sql語句中的所有關(guān)鍵詞均帶有合法的標(biāo)簽,則將該sql語中的標(biāo)簽去除后返回至應(yīng)用服務(wù)器,否則,返回指令錯誤信息。優(yōu)選地,所述步驟s1還包括對應(yīng)用服務(wù)器輸出的sql語句進行復(fù)制,以生成至少兩條相同的sql語句,并將復(fù)制生成的至少兩條sql語句作為子語句拼接成一條組合的sql語句,然后使所述組合的sql語句中的所有關(guān)鍵詞均帶上預(yù)生成的標(biāo)簽,其中相同子語句中的關(guān)鍵詞帶有相同的標(biāo)簽,不同子語句中的關(guān)鍵詞帶有不同的標(biāo)簽。優(yōu)選地,所述步驟s3還包括檢測組合的sql語句的每條子語句中的標(biāo)簽是否與所述步驟s1中添加的標(biāo)簽一致,若一致,則所述步驟s4選擇任意一條子語句將其中的標(biāo)簽去除后返回至應(yīng)用服務(wù)器,否則,返回所述指令錯誤信息。與現(xiàn)有技術(shù)相比,本發(fā)明一種sql注入攻擊防御組件及方法具有如下有益效果:本發(fā)明通過將標(biāo)簽與sql關(guān)鍵詞關(guān)聯(lián)的方式來校驗sql語句,克服了現(xiàn)有技術(shù)只能基于已知攻擊行為特征的防御手段,對含有未知特征sql注入攻擊無效的問題,在一定程度上,提高了系統(tǒng)的安全性。本發(fā)明通過引入生物特征的并采用按照周期變化的標(biāo)簽來進行sql語句的校驗,在一定程度上提高了標(biāo)簽本身的抗攻擊性,提高了系統(tǒng)的安全性。附圖說明本發(fā)明上述的和/或附加的方面和優(yōu)點從下面結(jié)合附圖對實施例的描述中將變得明顯和容易理解,其中:圖1為本發(fā)明實施例一種sql注入攻擊防御組件的應(yīng)用的網(wǎng)絡(luò)系統(tǒng)結(jié)構(gòu)示意圖;圖2為本發(fā)明實施例一種sql注入攻擊防御組件的模塊結(jié)構(gòu)示意圖;圖3為圖2的sql語句預(yù)處理模塊的工作過程示例示意圖;圖4為圖2的用戶輸入?yún)?shù)處理模塊的工作過程示例示意圖;圖5為輸入正常用戶參數(shù)時圖2中的注入攻擊檢測模塊以及注入檢測結(jié)果生成模塊的一個工作過程示例示意圖;圖6為輸入sql注入攻擊語句時圖2中的注入攻擊檢測模塊以及注入檢測結(jié)果生成模塊的一個工作過程示例示意圖;圖7為本發(fā)明實施例一種sql注入攻擊防御方法的方法流程示意圖。具體實施方式下面詳細(xì)描述本發(fā)明的實施例,所述實施例的示例在附圖中示出,其中自始至終相同或類似的標(biāo)號表示相同或類似的元件或具有相同或類似功能的元件。下面通過參考附圖描述的實施例是示例性的,僅用于解釋本發(fā)明,而不能解釋為對本發(fā)明的限制。請參閱圖1,本發(fā)明一種sql注入攻擊防御組件主要應(yīng)用于如圖1所示的網(wǎng)絡(luò)系統(tǒng)中,該網(wǎng)絡(luò)系統(tǒng)包括用以接收用戶輸入的參數(shù)信息的用戶輸入單元1、用以組織、存儲和管理數(shù)據(jù)的數(shù)據(jù)庫3、用以鏈接數(shù)據(jù)庫3的應(yīng)用服務(wù)器2以及用以甄別sql語句合法性的sql注入攻擊防御組件,其中,sql注入攻擊防御組件與應(yīng)用服務(wù)器2相連并向應(yīng)用服務(wù)器2提供調(diào)用接口,sql語句為應(yīng)用服務(wù)器2向數(shù)據(jù)庫3發(fā)送的數(shù)據(jù)請求信息;用戶輸入單元1為人機交互界面;應(yīng)用服務(wù)器2優(yōu)選為web應(yīng)用服務(wù)器。請參閱圖2,下面以圖2為例說明解釋本發(fā)明的sql注入攻擊防御組件的一個實施例,該sql注入攻擊防御組件包括sql語句預(yù)處理模塊21、用戶輸入?yún)?shù)處理模塊22、注入攻擊檢測模塊23以及注入檢測結(jié)果生成模塊24,其中,sql語句預(yù)處理模塊21用于使應(yīng)用服務(wù)器2輸出的sql語句中的所有sql關(guān)鍵詞分別帶上預(yù)生成的標(biāo)簽;用戶輸入?yún)?shù)處理模塊22用于將用戶輸入的參數(shù)添加到經(jīng)過sql語句預(yù)處理模塊21處理后的sql語句中;注入攻擊檢測模塊23用于檢測經(jīng)過用戶輸入?yún)?shù)處理模塊處理后的sql語句中的所有關(guān)鍵字是否均帶有合法的標(biāo)簽,合法是指與sql語句預(yù)處理模塊21中添加的標(biāo)簽相同;注入檢測結(jié)果生成模塊24用于根據(jù)注入攻擊檢測模塊23的檢測結(jié)果返回相應(yīng)的信息,若注入攻擊檢測模塊24檢測到sql語句中的所有關(guān)鍵詞均帶有合法的標(biāo)簽,則將該sql語中的標(biāo)簽去除后返回至應(yīng)用服務(wù)器2,否則,返回指令錯誤信息。詳細(xì)地,sql語句為一種數(shù)據(jù)庫查詢和程序設(shè)計語言,用于存取數(shù)據(jù)以及查詢、更新和管理關(guān)系數(shù)據(jù)庫系統(tǒng)。示例地,sql語句中的數(shù)據(jù)記錄篩選語句如下:sql="select*from數(shù)據(jù)表where字段名=字段值"。sql關(guān)鍵詞為sql語句中的保留字,也即具有特定語義的單詞或者字符串,考慮到sql保留字有很多,而且不同的數(shù)據(jù)庫的保留字也是不同的,因此,在此僅僅示例如下:select:用來指定由查詢返回的列;intonewtable:用來創(chuàng)建一個新的臨時表;fromtable_source:指定查詢的數(shù)據(jù)源;whereserch_conditaion:用來限定返回行的搜索條件;droptabletablename直接從當(dāng)前數(shù)據(jù)庫刪這個表。預(yù)生成的標(biāo)簽是一種與sql關(guān)鍵詞構(gòu)造結(jié)構(gòu)不同的一種標(biāo)識字符,其可以隨機生成,也可以根據(jù)用戶的指紋信息生成,還可以按周期變化,譬如,設(shè)定周期為1日,則每天預(yù)生成不同的標(biāo)簽。在一些實施方式中,標(biāo)簽通過調(diào)用randomalphanumeric()函數(shù)生成??紤]到若僅設(shè)置一種標(biāo)簽有可能被黑客獲知,因此,為了提高數(shù)據(jù)的安全性,優(yōu)選地,在獲取sql語句后可以將其復(fù)制為至少兩份,這樣就提高了防御的準(zhǔn)確性。具體來說,sql語句預(yù)處理模塊21收到應(yīng)用服務(wù)器2輸出的sql語句后先對其進行復(fù)制,以生成至少兩條相同的sql語句,并將復(fù)制生成的至少兩條sql語句作為子語句拼接成一條組合的sql語句,然后使組合的sql語句中的所有關(guān)鍵詞均帶上預(yù)生成的標(biāo)簽,其中相同子語句中的關(guān)鍵詞帶有相同的標(biāo)簽,不同子語句中的關(guān)鍵詞帶有不同的標(biāo)簽。但是,考慮到數(shù)據(jù)處理的速度,sql語句的復(fù)制份數(shù)并不是越多越好,一般是僅做一次復(fù)制,因此,在實際中,優(yōu)選為兩條sql子語句。針對sql子語句,注入攻擊檢測模塊23還需要匹配地設(shè)置為檢測組合的sql語句的每條子語句中的標(biāo)簽是否與sql語句預(yù)處理模塊21添加的標(biāo)簽一致,若一致,則注入檢測結(jié)果生成模塊24選擇任意一條子語句將其中的標(biāo)簽去除后返回至應(yīng)用服務(wù)器2,否則,返回所述指令錯誤信息請參閱圖3-圖5,圖3-圖5示出了本發(fā)明一個應(yīng)用示例的工作原理:首先,如圖3所示,sql語句預(yù)處理模塊21對應(yīng)用服務(wù)器2傳入的sql語句“select*frombbswherename=?”進行復(fù)制,生成兩條sql語句后以“&&”為連接符拼接成一條組合的sql語句,然后對不同子語句中的sql關(guān)鍵詞分別加上不同的標(biāo)簽“1”和“2”,得到的結(jié)果為“select1*from1bbswhere1name=1?&&select2*from2bbswhere2name=2?”。其次,用戶輸入?yún)?shù)處理模塊22將用戶輸入內(nèi)容“zhangsan”分別添加到sql語句預(yù)處理模塊21得到的sql語句的子語句中。具體地,用戶通過調(diào)用不同的接口函數(shù)傳遞不同類型的參數(shù),接口函數(shù)有一個參數(shù)表示參數(shù)傳遞的位置,因為sql語句預(yù)處理模塊中使用“?”表示需要用戶傳遞參數(shù),所以通過替換將用戶參數(shù)添加到sql語句中。示例地,sql語句為str=“update*fromusddernawherename=?andage=?”,預(yù)處理函數(shù)為mimicprocess(str,2),”2”表示需要傳遞兩個參數(shù),用戶輸入?yún)?shù)處理模塊函數(shù)setstringparameters(1,"zhangsan")表示向第一個參數(shù)傳遞字符串類型的參數(shù)“zhangsan”;用戶輸入?yún)?shù)處理模塊函數(shù)setintparameters(2,23)表示向第二個參數(shù)傳遞整型類型的參數(shù)“23”,于是得到str=“update*fromusddernawherename="zhangsan"andage=“23””。同上述原理相同,此處只是將用戶輸入內(nèi)容“zhangsan”分別添加到sql語句預(yù)處理模塊21得到的sql語句的子語句中,因此其結(jié)果為“select1*from1bbswhere1name=1“zhangsan”&&select2*from2bbswhere2name=2“zhangsan””,如圖4所示。然后,注入攻擊檢測模塊23根據(jù)用戶輸入?yún)?shù)模塊22的處理結(jié)果,分別對連接符連接的兩個sql子語句進行標(biāo)簽識別,以檢測連接符之前的子語句中的所有關(guān)鍵詞是否含有標(biāo)簽“1”且連接符之后的子語句中的所有關(guān)鍵詞是否含有標(biāo)簽“2”,通過檢測,可見各sql子語句中的sql關(guān)鍵詞均含有各自的特征標(biāo)簽,處理結(jié)果如圖5所示。最后,參閱圖5,注入檢測結(jié)果生成模塊24根據(jù)注入攻擊檢測模塊23的結(jié)果向應(yīng)用服務(wù)器2返回檢測結(jié)果,因為在本示例中注入攻擊檢測模塊23檢測到各sql子語句中的sql關(guān)鍵詞均含有各自對應(yīng)的特征標(biāo)簽,所以注入檢測結(jié)果生成模塊24隨機選擇用戶輸入?yún)?shù)處理模塊結(jié)果中的一條sql子語句進行去標(biāo)簽化處理,并最終將去掉標(biāo)簽的子語句返回給應(yīng)用服務(wù)器2,如圖5所示。請參閱圖6,如果用戶輸入具有sql注入攻擊語句時,譬如,假設(shè)用戶的輸入為“zhangsan;droptablebbs;”,本發(fā)明組件的總體處理流程如圖7,因經(jīng)過用戶輸入?yún)?shù)模塊22處理后,各sql子語句中均含有不帶標(biāo)簽的sql關(guān)鍵詞“drop”和“table”,所以注入攻擊檢測模塊23在標(biāo)簽識別時,將檢測到連接符之前的子語句中的關(guān)鍵詞“drop”和“table”不含有標(biāo)簽“1”且連接符之后的子語句中的關(guān)鍵詞“drop”和“table也不含有標(biāo)簽“2”,所以最終被判定為非法輸入,由注入檢測結(jié)果生成模塊24向應(yīng)用服務(wù)器2返回“false”,表示用戶輸入含有sql注入攻擊行為,應(yīng)用服務(wù)器2會根據(jù)此返回結(jié)果進行相應(yīng)處理。與現(xiàn)有技術(shù)相比,本發(fā)明實施例的sql注入攻擊防御組件具有如下有益效果:本發(fā)明實施例通過sql語句預(yù)處理模塊21、用戶輸入?yún)?shù)處理模塊22、注入攻擊檢測模塊23以及注入檢測結(jié)果生成模塊24的設(shè)置,克服了現(xiàn)有技術(shù)只能基于已知攻擊行為特征的防御手段,解決了對含有未知特征sql注入攻擊無效的問題,在一定程度上,提高了系統(tǒng)的安全性。本發(fā)明實施例通過引入生物特征的并采用按照周期變化的標(biāo)簽來進行sql語句的校驗,在一定程度上提高了標(biāo)簽本身的抗攻擊性,提高了系統(tǒng)的安全性。請參閱圖7,基于同本發(fā)明一種sql注入攻擊防御組件相同的發(fā)明構(gòu)思,本發(fā)明實施例還提供一種sql注入攻擊防御組件方法,關(guān)于其具體說明解釋可參見sql注入攻擊防御組件,該sql注入攻擊防御組件方法包括如下步驟:s1,使應(yīng)用服務(wù)器輸出的sql語句中的所有sql關(guān)鍵詞分別帶上預(yù)生成的標(biāo)簽;s2,將用戶輸入的參數(shù)添加到經(jīng)過步驟s1處理后的sql語句中;s3,檢測經(jīng)過步驟s2處理后的sql語句中的所有關(guān)鍵字是否均帶有合法的標(biāo)簽,合法是指與步驟s1中添加的標(biāo)簽相同;s4,根據(jù)步驟s3的檢測結(jié)果返回相應(yīng)的信息,若步驟s3檢測到sql語句中的所有關(guān)鍵詞均帶有合法的標(biāo)簽,則將該sql語中的標(biāo)簽去除后返回至應(yīng)用服務(wù)器,否則,返回指令錯誤信息。其中,步驟s1還包括如下步驟:對應(yīng)用服務(wù)器輸出的sql語句進行復(fù)制,以生成至少兩條相同的sql語句,并將復(fù)制生成的至少兩條sql語句作為子語句拼接成一條組合的sql語句;使所述組合的sql語句中的所有關(guān)鍵詞均帶上預(yù)生成的標(biāo)簽,其中相同子語句中的關(guān)鍵詞帶有相同的標(biāo)簽,不同子語句中的關(guān)鍵詞帶有不同的標(biāo)簽。其中,步驟s3還包括如下步驟:檢測組合的sql語句的每條子語句中的標(biāo)簽是否與步驟s1中添加的標(biāo)簽一致,若一致,則步驟s4選擇任意一條子語句將其中的標(biāo)簽去除后返回至應(yīng)用服務(wù)器,否則,返回指令錯誤信息。與現(xiàn)有技術(shù)相比,本發(fā)明實施例一種sql注入攻擊防御組件方法具有如下有益效果:本發(fā)明實施例通過將標(biāo)簽與sql關(guān)鍵詞關(guān)聯(lián)的方式來校驗sql語句,克服了現(xiàn)有技術(shù)只能基于已知攻擊行為特征的防御手段,對含有未知特征sql注入攻擊無效的問題,在一定程度上,提高了系統(tǒng)的安全性。以上所述僅是本發(fā)明的部分實施方式,應(yīng)當(dāng)指出,對于本
技術(shù)領(lǐng)域:
:的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也應(yīng)視為本發(fā)明的保護范圍。當(dāng)前第1頁12當(dāng)前第1頁12