專利名稱:一種基于自學(xué)習(xí)的數(shù)據(jù)庫sql注入防護方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種數(shù)據(jù)庫SQL注入防護方法,特別是涉及一種基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護方法。
背景技術(shù):
隨著Internet的發(fā)展,基于B/S模式的商業(yè)動態(tài)網(wǎng)站的開發(fā)越來越受到各大公司的青睞,該模式大多采用ASP(.NET)+SQL+IIS的平臺架構(gòu),因此使用這種模式編寫應(yīng)用程序的程序員也越來越多。但編程人員水平的參差不齊以及安全防御技術(shù)的不成熟,給應(yīng)用系統(tǒng)帶來了很多不安全因素。大部分web應(yīng)用系統(tǒng)需要與用戶進行交互,從用戶那里接受數(shù)據(jù)并進行處理,如果攻擊者故意輸入含有惡意構(gòu)造的數(shù)據(jù),則在系統(tǒng)執(zhí)行處理時,這些數(shù)據(jù)中包含的惡意代碼就會被系統(tǒng)或者其它客戶端執(zhí)行,從而對服務(wù)器或客戶端造成損害,這就是所謂的SQL注入。
由于SOL注入是從正常的WWW端口訪問,并且看起來和正常的web頁面訪問沒有什么區(qū)別,所以目前常見的防火墻檢測不到SQL注入。如何有效地防御SOL注入也成了人們關(guān)注的問題。
目前對于防護SQL注入,比較常見的方法比如屏蔽錯誤信息,對用戶輸入進行合法性檢查,過濾單引號,以及根據(jù)已知的SQL注入方式進行特征過濾檢查等。這幾種防護手段都能夠一定程度上減少SQL注入的攻擊。然而對于一些有經(jīng)驗的攻擊者來說,繞過這些防御并不是難事,比如針對用戶輸入檢查,攻擊者可以將輸入的部分或全部字符全部用ASCII碼代替來避開檢查。而且SQL注入方式變化多樣,幾乎每天都有新的攻擊手段出現(xiàn),基于已知的特征過濾存在著相當(dāng)大的缺陷,而且單純的特征過濾誤報率非常高,比如一些顯著的SQL注入語句都包含1=1特征,如果特征檢查過程中將所有的包含1=1特征的SQL語句判定非法,這樣大量合法的SQL語句都將被阻斷,而與1=1效果相同的注入攻擊方式2=2,(1)=(1),abs(1)=abs(1)等都可能被放過。
本發(fā)明通過分析合法SQL語句的特征構(gòu)造知識庫,現(xiàn)實環(huán)境下將SQL語句與知識庫進行匹配,識別合法的SQL語句,從而過濾非法SQL語句。在工作流程上,與申請日為20070917,專利號200710145398.8的“一種SQL注入攻擊檢測方法及系統(tǒng)”類似,都包括知識庫構(gòu)建的階段(類似學(xué)習(xí)階段)以及實時SQL注入攻擊檢測階段(類似過濾階段),不過兩者在實現(xiàn)上有較大差別?!耙环NSQL注入攻擊檢測方法及系統(tǒng)”知識庫的構(gòu)建是基于分析SQL注入樣本,實時檢測階段主要是根據(jù)已知的SQL注入特征進行過濾。而本發(fā)明知識庫的構(gòu)建是基于學(xué)習(xí)合法SQL語句,實時工作環(huán)境下根據(jù)檢測SQL語句的合法特征來過濾非法語句。對于特定的應(yīng)用業(yè)務(wù)系統(tǒng),合法的SQL語句的特征相對比較固定,因此通過識別這些合法SQL語句來阻斷含有注入特征的非法SQL語句能夠極大提高整個系統(tǒng)的防御能力,同時對于上層應(yīng)用系統(tǒng)完全透明。
發(fā)明內(nèi)容
本發(fā)明克服了傳統(tǒng)的基于特征過濾的SQL注入防護方法存在大量的漏報以及誤報的缺陷,提出了一種基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護方法與系統(tǒng)。該注入防護方法通過在安全的環(huán)境下學(xué)習(xí)所有合法SQL語句的特征,構(gòu)建一套完整的知識模型,在現(xiàn)實環(huán)境中,利用模式匹配的方法對所有SQL語句進行檢查,通過識別出所有合法的SQL語句,來達到阻斷含有過濾特征的非法SQL語句的目的。這種基于自學(xué)習(xí)構(gòu)建的知識模型,然后利用模式匹配識別合法SQL語句來過濾非法SQL語句的方法,能夠大幅度減少其他SQL防護方法存在的大量漏報以及誤報,可以極大增強整個系統(tǒng)的防御SQL注入能力。
本發(fā)明通過以下技術(shù)方案實現(xiàn)。
一種新的基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護方法,包括學(xué)習(xí)階段和過濾階段。學(xué)習(xí)階段工作在安全環(huán)境下,此時所有的SQL語句都是由應(yīng)用系統(tǒng)產(chǎn)生的合法SQL語句,通過對這些語句進行解析,基于解析結(jié)果,分析并統(tǒng)計它們的特征,從而構(gòu)建一個合法SQL語句的知識模型(知識庫);過濾階段工作在現(xiàn)實環(huán)境中,此時假設(shè)所有的SQL語句都可能是非法SQL語句,將這些語句與安全環(huán)境下建立的知識庫進行模式匹配,匹配成功則為合法的SQL語句,否則為非法SQL語句。
學(xué)習(xí)階段包括如下步驟 301.接收一條SQL語句; 302.對SQL語句進行解析,產(chǎn)生SQL語法樹,如果解析出錯,跳轉(zhuǎn)至步驟301,重新接受SQL語句; 303.對語法樹進行分析,獲取訪問行為特征; 304.根據(jù)預(yù)定規(guī)則對語法樹進行裁剪,獲取SQL語句的主干結(jié)構(gòu)特征; 305.將所有不同的特征進行分類統(tǒng)計,加入知識庫; 306.通過一段時間全面的學(xué)習(xí),構(gòu)建完整的知識庫。
過濾階段包括如下步驟 401.接收一條SQL語句; 402.對SQL語句進行解析,產(chǎn)生語法樹,如果解析出錯,跳轉(zhuǎn)至步驟406; 403.對語法樹進行分析,獲取訪問行為特征,將訪問行為特征與知識庫進行匹配,匹配不成功則跳轉(zhuǎn)至步驟407,否則跳轉(zhuǎn)至步驟404; 404.根據(jù)預(yù)定規(guī)則對語法樹進行裁剪,獲取SQL語句的主干結(jié)構(gòu)特征,將其與知識庫進行匹配,匹配不成功跳轉(zhuǎn)至步驟408,否則跳轉(zhuǎn)至步驟405; 405.判定SQL語句合法,允許其通行; 406.SQL語句語法錯誤,判定該語句非法,產(chǎn)生報警信息。
407.訪問行為不合法,判定SQL語句非法,產(chǎn)生報警信息; 408.主干結(jié)構(gòu)不合法,判定SQL語句非法,產(chǎn)生報警信息。
一種基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護系統(tǒng),包括SQL解析器、SQL學(xué)習(xí)單元、SQL過濾單元、知識庫單元、控制管理模塊、日志報警單元、遠(yuǎn)程管理客戶端。
SQL解析器負(fù)責(zé)解析SQL語句,包括詞法解析、語法解析、語義解析。詞法解析負(fù)責(zé)對存儲一段連續(xù)緩沖區(qū)的原始SQL語句進行分解,得到一個個獨立的單詞,并且組織成為單詞鏈表形式。語法解析負(fù)責(zé)根據(jù)特定數(shù)據(jù)庫的SQL語法對詞法解析后的單詞鏈進行語法結(jié)構(gòu)分析,構(gòu)造出SQL語法樹。語義分析負(fù)責(zé)根據(jù)SQL語法樹分析該SQL語句的語義特征。
SQL學(xué)習(xí)單元負(fù)責(zé)學(xué)習(xí)所有合法SQL語句的特征,然后利用這些特征構(gòu)建知識庫。SQL學(xué)習(xí)單元借助SQL解析器,獲得所有合法SQL語句的特征,具體特征包括語句的主干結(jié)構(gòu)以及數(shù)據(jù)庫訪問行為。學(xué)習(xí)單元將不同的SQL語句的主干結(jié)構(gòu)進行存儲,形成SQL池,將所有合法的數(shù)據(jù)庫訪問行為進行存儲,形成數(shù)據(jù)庫行為池。SQL池以及數(shù)據(jù)庫行為池共同構(gòu)成了知識庫單元。
SQL過濾單元負(fù)責(zé)在現(xiàn)實環(huán)境下實時對非法SQL語句進行過濾。此時系統(tǒng)認(rèn)為所有經(jīng)過的SQL語句都是可疑的SQL語句,同樣利用SQL解析器對SQL語句解析,獲取其特征。然后將其特征與知識庫單元所包含的數(shù)據(jù)庫行為池以及SQL池進行匹配。通過與數(shù)據(jù)庫行為池的匹配,來檢查該SQL語句的訪問行為是否合法,通過與SQL池進行匹配,來檢查該SQL語句主干結(jié)構(gòu)是否合法,只有兩次匹配都成功,才能夠判定該SQL語句合法,否則判定非法,進行阻斷并產(chǎn)生報警。
知識庫單元負(fù)責(zé)存儲學(xué)習(xí)階段獲取的所有SQL語句特征,包括用于存儲SQL訪問行為相關(guān)特征的數(shù)據(jù)庫行為池以及存儲SQL語句主干結(jié)構(gòu)特征的SQL池。為了提高匹配的效率,SQL池和數(shù)據(jù)庫行為池的內(nèi)部存儲采用多級別的索引進行組織。
控制管理單元負(fù)責(zé)接收本地管理員或者遠(yuǎn)程管理客戶端指令,動態(tài)更新本地策略,以及實時切換系統(tǒng)工作模式(學(xué)習(xí)階段、過濾階段)。
日志報警單元負(fù)責(zé)接收其他單元的報警信息,記錄日志,同時將報警信息發(fā)送至遠(yuǎn)程管理客戶端,或者以郵件的方式發(fā)送給相關(guān)管理員。
遠(yuǎn)程管理客戶端負(fù)責(zé)遠(yuǎn)程監(jiān)控管理系統(tǒng),比如接收各種實時狀態(tài)信息以及下發(fā)策略,切換工作模式等。
本發(fā)明所述一種基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護方法中,在學(xué)習(xí)階段,提取的SQL語句相關(guān)特征包括訪問行為特征以及SQL主干結(jié)構(gòu)特征。訪問行為特征為SQL語句涉及的所有數(shù)據(jù)庫對象,以及對該對象的操作;主干結(jié)構(gòu)特征為SQL語法結(jié)構(gòu)特征。
本發(fā)明所述一種基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護方法中,訪問行為特征,涉及的數(shù)據(jù)庫對象包括表、列、視圖、別名等;操作行為包括查詢、插入、修改、刪除、更新等。
本發(fā)明所述一種基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護方法中,SQL主干特征,根據(jù)預(yù)定規(guī)則對語法樹進行裁剪,裁剪過程負(fù)責(zé)將SQL語句中用戶輸入部分,比如數(shù)據(jù)以及字符串,用通配符進行替換,同時將一些無用的節(jié)點刪除。
本發(fā)明所述一種基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護方法中,SQL語句的解析包括如下步驟詞法解析,語法解析以及語義解析。
本發(fā)明所述一種基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護方法中,在學(xué)習(xí)階段,將學(xué)習(xí)到的特征加入知識庫的過程中需要將該特征與現(xiàn)有的知識庫進行匹配,如果匹配成功說明存在相同特征,不需要加入,否則將該特征加入相應(yīng)位置。
本發(fā)明所述一種基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護方法中,在過濾階段,為了提高特征的匹配的效率以及成功率,在匹配過程中采用高效的HASH函數(shù),同時在一次匹配過程中利用多個不同的HASH算法,計算多個HASH值進行匹配。
本發(fā)明所述一種基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護方法中,在過濾階段,特征匹配包括訪問行為與知識庫的數(shù)據(jù)庫行為池的匹配,SQL主干結(jié)構(gòu)與知識庫內(nèi)的SQL池進行匹配。具體步驟如下 數(shù)據(jù)庫行為池的匹配 901.對SQL語法樹進行分析,獲取訪問行為,具體包括涉及數(shù)據(jù)庫訪問對象以及對其的操作。
902.計算數(shù)據(jù)庫對象名的HASH值,以HASH值為索引,找出相同數(shù)據(jù)庫對象名稱,如果存在相同數(shù)據(jù)庫對象則跳至步驟903進行行為匹配,否則跳至步驟904; 903.比較該對象的操作行為,如果存在該行為則跳至步驟906,否則跳至步驟905; 904.匹配不成功,返回原因不存在相同數(shù)據(jù)庫對象; 905.匹配不成功,返回原因數(shù)據(jù)對象的操作不合法; 906.匹配成功,返回。
SQL池的匹配 1001.對解析后SQL語法樹進行裁剪,形成規(guī)范語法樹; 1002.計算語法樹的兩棵不同的子樹的HASH值hash1、hash2; 1003.以hash1為索引,進行查找,如果存在相同hash值則跳至步驟1004,否則跳至步驟1006; 1004.找出ha sh1相同的語法樹,比較hash2,相同則跳至步驟1005,否則跳至步驟1006; 1005.匹配成功; 1006.匹配失敗。
本發(fā)明的有益效果是基于學(xué)習(xí)合法SQL語句的SQL注入防護系統(tǒng)能夠大幅減少傳統(tǒng)SQL注入防護產(chǎn)生的誤報率以及漏報率,提高整個系統(tǒng)的防御能力。同時系統(tǒng)對于應(yīng)用業(yè)務(wù)系統(tǒng)完全透明,上層系統(tǒng)無需做任何改動。
圖1為本發(fā)明學(xué)習(xí)階段具體處理流程圖; 圖2為本發(fā)明過濾階段具體處理流程圖; 圖3為本發(fā)明數(shù)據(jù)庫行為池匹配流程圖; 圖4為本發(fā)明SQL池匹配流程圖; 圖5為本發(fā)明防注入系統(tǒng)組成示意圖; 圖6為語法數(shù)生成流程示意圖; 圖7為規(guī)范語法樹示意圖。
具體實施例方式 下面結(jié)合附圖以及具體實例對本發(fā)明進一步說明。
本發(fā)明所述的新的基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護方法,包括兩個工作階段學(xué)習(xí)階段、過濾階段。
如圖1所示,學(xué)習(xí)階段在安全環(huán)境中,學(xué)習(xí)所有的合法SQL語句,提取特征,從而構(gòu)建知識庫,具體步驟如下 301接收一條SQL語句; 假設(shè)下面為學(xué)習(xí)階段將被學(xué)習(xí)的合法SQL語句 1、select*from a where username=‘liming’and passwd=123456; 2、select*from USER_CATALOG; 3、select*from person where cardNum=124 and name=‘li’and 1=1; 4、insert into Employees(FirstName,LastName,Title)values(′Harry′,′Washington′,′Trainee′); 5、update Employees set ReportsTo=5 WHERE ReportsTo=2; 6、delete*from Employees where FirstName=‘Harry’。
302對SQL語句進行解析,產(chǎn)生SQL語法樹,如果解析出錯,跳轉(zhuǎn)至301,重新接受SQL語句; 該步驟利用SQL解析模塊對原始SQL進行解析,根據(jù)詞法分析將SQL分解為不同的單詞,通過語法分析生成語法樹,類似過程如圖6所示。
每一條SQL語句都將會解析為語法樹結(jié)構(gòu)。對于不符合相關(guān)SQL語法的語句,將會拋出錯誤提示,重新讀取下一條語句。
303對語法樹進行分析,獲取訪問行為特征; 對語法樹特定域進行分析,獲取該SQL語句的數(shù)據(jù)庫訪問行為,包括數(shù)據(jù)庫對象名稱以及對其的操作。
1、select*from a where username=‘liming’and passwd=123456; 數(shù)據(jù)庫訪問行為如下 2、select*from USER_CATALOG; 數(shù)據(jù)庫訪問行為如下 3、select*from person where cardNum=124 and name=‘li’and1=1; 數(shù)據(jù)庫訪問行為如下 4、insert into Employees(FirstName,LastName,Title)values(′Harry′,′Washington′,′Trainee′); 數(shù)據(jù)庫訪問行為如下 5、update Employees set ReportsTo=5 WHERE ReportsTo=2; 數(shù)據(jù)庫訪問行為如下 6、delete*from Employees where FirstName=‘Harry’ 數(shù)據(jù)庫訪問行為如下 304根據(jù)預(yù)定規(guī)則對語法樹進行裁剪,獲取SQL語句的主干結(jié)構(gòu)特征; 對語法樹進行語法進行裁剪,成為規(guī)范語法樹,獲取SQL語句的主干結(jié)構(gòu)。裁剪過程負(fù)責(zé)將SQL語句中用戶輸入部分,比如數(shù)據(jù)以及字符串,用通配符進行替換,同時將一些無用的節(jié)點刪除。
對于select*from person where cardNum=124 and name=‘li’and1=1解析后的語法樹。將用戶輸入字段(字符串、數(shù)字),用一些特殊通配符進行替換。我們假設(shè)將數(shù)字替換為‘$’,將輸入字符串替換為‘&’,通過替換后,產(chǎn)生的規(guī)范語法樹如圖7所示。
通過語法樹的裁剪,將用戶輸入部分進行替換,可以獲取所有的SQL主干結(jié)構(gòu)。
305將所有不同的特征進行分類統(tǒng)計,加入知識庫; 將步驟303得到的訪問行為特征以及304得到的SQL主干結(jié)構(gòu),以一定的方式存儲起來,分別加入知識庫中的數(shù)據(jù)庫行為池以及SQL池中。加入知識庫的過程中需要將該特征與現(xiàn)有的知識庫進行匹配,如果匹配成功說明存在相同特征,不需要加入,否則將該特征加入相應(yīng)位置。
306通過一段時間全面的學(xué)習(xí),構(gòu)建完整的知識庫。
經(jīng)過學(xué)習(xí)合法的SQL語句,知識庫內(nèi)的SQL池將會記錄所有合法的SQL語句的不同的主干架構(gòu)。數(shù)據(jù)庫行為池將會記錄所有的數(shù)據(jù)庫訪問行為,具體內(nèi)容如下表所示 基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護方法,過濾階段負(fù)責(zé)在現(xiàn)實環(huán)境中,對所有經(jīng)過的SQL語句與知識庫進行匹配,根據(jù)匹配結(jié)果判斷該SQL語句是否為合法的SQL語句。具體步驟如圖2所示。下面以具體實例詳細(xì)進行介紹。
401接收一條SQL語句; 我們以如下幾條SQL語句為具體實例 1)select*from a where username=‘chenfeng’and passwd=123; 2)select*from USER_CATALOG where 1=1; 3)select*from person where age=24 and name=‘li’and 1=1; 402對SQL語句進行解析,產(chǎn)生語法樹,如果解析出錯,跳轉(zhuǎn)至407; 如學(xué)習(xí)階段,對所有的SQL語句進行解析,獲取語法樹。對于不符合SQL語句的語句,直接判定為非法SQL語句。
403對語法樹進行分析,獲取訪問行為特征,將訪問行為特征與知識庫進行匹配,匹配不成功則跳轉(zhuǎn)至步驟407,否則跳轉(zhuǎn)至步驟404; 對于select*from a where username=‘chenfeng’and passwd=123; 數(shù)據(jù)庫訪問行為 將訪問行為與數(shù)據(jù)庫行為池進行匹配。匹配過程參考圖3。步驟902對數(shù)據(jù)庫對象名a,username,passwd,利用HASH算法,求hash值,利用hash值查找數(shù)據(jù)庫行為池,找到具有相同名稱的數(shù)據(jù)庫對象。步驟903檢查該數(shù)據(jù)庫對象行為是否匹配。通過匹配,該語句的數(shù)據(jù)庫訪問行為合法。
如上步驟,select*from USER_CATALOG where 1=1訪問行為合法。而對于select*from person where age=24 and name=‘li’and 1=1,由于包含新的數(shù)據(jù)庫對象age,導(dǎo)致數(shù)據(jù)庫行為匹配不成功,跳至406。
404.根據(jù)預(yù)定規(guī)則對語法樹進行裁剪,獲取SQL語句的主干結(jié)構(gòu)特征,將其與知識庫進行匹配,匹配不成功跳轉(zhuǎn)至步驟408,否則跳轉(zhuǎn)至步驟405; SQL語句1)和2)通過了數(shù)據(jù)庫訪問行為特征匹配,這一步通過獲取SQL語句主干,進行SQL池的匹配。
SQL池的匹配過程參考圖4。
分別利用兩個不同的HASH函數(shù),對規(guī)范的語法樹的不用域求出兩個不同的HASH值hash1,hash2。以hash1為索引進行查找,縮小查找范圍。最后同時比較hash1、hash2以判斷是否存在完全相同SQL主干結(jié)構(gòu)。
通過裁剪的語句1)的主干特征與SQL池匹配,而語句2)的主干特征不匹配。因此1)為合法跳至405,2)為非法,跳至406。
405.判定SQL語句合法,允許其通行; 406.SQL語句語法錯誤,判定該語句非法,產(chǎn)生報警信息。
407.訪問行為不合法,判定SQL語句非法,產(chǎn)生報警信息; 408.主干結(jié)構(gòu)不合法,判定SQL語句非法,產(chǎn)生報警信息。
如圖5所示,新的基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護系統(tǒng),包括如下七個單元 SQL解析器負(fù)責(zé)解析SQL語句,包括詞法解析、語法解析、語義解析。詞法解析負(fù)責(zé)對存儲一段連續(xù)緩沖區(qū)的原始SQL語句進行分解,得到一個個獨立的單詞,并且組織成為單詞鏈表形式。語法解析負(fù)責(zé)根據(jù)特定數(shù)據(jù)庫的SQL語法對詞法解析后的單詞鏈進行語法結(jié)構(gòu)分析,構(gòu)造出SQL語法樹。語義分析負(fù)責(zé)根據(jù)SQL語法樹分析該SQL語句的語義特征。
SQL學(xué)習(xí)單元負(fù)責(zé)學(xué)習(xí)所有合法SQL語句的特征,然后利用這些特征構(gòu)建知識庫。SQL學(xué)習(xí)單元借助SQL解析器,獲得所有合法SQL語句的特征,具體特征包括語句的主干結(jié)構(gòu)以及數(shù)據(jù)庫訪問行為。學(xué)習(xí)單元將不同的SQL語句的主干結(jié)構(gòu)進行存儲,形成SQL池,將所有合法的數(shù)據(jù)庫訪問行為進行存儲,形成數(shù)據(jù)庫行為池。SQL池以及數(shù)據(jù)庫行為池共同構(gòu)成了知識庫單元。
SQL過濾單元負(fù)責(zé)在現(xiàn)實環(huán)境下實時對非法SQL語句進行過濾。此時系統(tǒng)認(rèn)為所有經(jīng)過的SQL語句都是可疑的SQL語句,同樣利用SQL解析器對SQL語句解析,獲取其特征。然后將其特征與知識庫單元所包含的數(shù)據(jù)庫行為池以及SQL池進行匹配。通過與數(shù)據(jù)庫行為池的匹配,來檢查該SQL語句的訪問行為是否合法,通過與SQL池進行匹配,來檢查該SQL語句主干結(jié)構(gòu)是否合法,只有兩次匹配都成功,才能夠判定該SQL語句合法,否則判定非法,進行阻斷并產(chǎn)生報警。
知識庫單元負(fù)責(zé)存儲學(xué)習(xí)階段獲取的所有SQL語句特征,包括用于存儲SQL訪問行為相關(guān)特征的數(shù)據(jù)庫行為池以及存儲SQL語句主干結(jié)構(gòu)特征的SQL池。為了提高匹配的效率,SQL池和數(shù)據(jù)庫行為池的內(nèi)部存儲采用多級別的索引進行組織。
控制管理單元負(fù)責(zé)接收本地管理員或者遠(yuǎn)程管理客戶端指令,動態(tài)更新本地策略,以及實時切換系統(tǒng)工作模式(學(xué)習(xí)階段、過濾階段)。
日志報警單元負(fù)責(zé)接收其他單元的報警信息,記錄日志,同時將報警信息發(fā)送至遠(yuǎn)程管理客戶端,或者以郵件的方式發(fā)送給相關(guān)管理員。
遠(yuǎn)程管理客戶端負(fù)責(zé)遠(yuǎn)程監(jiān)控管理系統(tǒng),比如接收各種實時狀態(tài)信息以及下發(fā)策略,切換工作模式等。
SQL學(xué)習(xí)單元負(fù)責(zé)構(gòu)建知識庫,而SQL過濾單元利用知識庫來實時過濾含注入SQL語句。SQL學(xué)習(xí)單元和SQL過濾單元在工作過程都需要調(diào)用SQL解析器對SQL語句進行解析。遠(yuǎn)程管理客戶端通過與控制管理單元交互來監(jiān)控管理整個系統(tǒng)。
權(quán)利要求
1、一種基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護方法,其特征在于,包括以下步驟
學(xué)習(xí)階段在安全環(huán)境下,學(xué)習(xí)所有的合法SQL語句,提取特征,從而構(gòu)建知識庫;
過濾階段在現(xiàn)實環(huán)境下,對所有經(jīng)過的SQL語句與知識庫進行匹配,根據(jù)匹配結(jié)果判斷該SQL語句的合法性。
2、根據(jù)權(quán)利要求1所述的一種基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護方法,其特征在于,所述的提取的SQL語句相關(guān)特征包括
訪問行為特征包括SQL語句所涉及的所有數(shù)據(jù)庫對象,以及對該對象的操作行為;
主干結(jié)構(gòu)特征SQL語法結(jié)構(gòu)特征。
3、根據(jù)權(quán)利要求1所述的一種基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護方法,其特征在于,所述學(xué)習(xí)階段包括如下步驟
301.接收一條SQL語句;
302.對SQL語句進行解析,產(chǎn)生SQL語法樹,如果解析出錯,跳轉(zhuǎn)至步驟301,重新接受SQL語句;
303.對語法樹進行分析,獲取訪問行為特征;
304.根據(jù)預(yù)定規(guī)則對語法樹進行裁剪,獲取SQL語句的主干結(jié)構(gòu)特征;
305.將所有不同的特征進行分類統(tǒng)計,加入知識庫;
306.通過一段時間全面的學(xué)習(xí),構(gòu)建完整的知識庫。
4、根據(jù)權(quán)利要求1所述的一種基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護方法,其特征在于,所述過濾階段包括如下步驟
401.接收一條SQL語句;
402.對SQL語句進行解析,產(chǎn)生語法樹,如果解析出錯,跳轉(zhuǎn)至步驟406;
403.對語法樹進行分析,獲取訪問行為特征,將訪問行為特征與知識庫進行匹配,匹配不成功則跳轉(zhuǎn)至步驟407,否則跳轉(zhuǎn)至步驟404;
404.根據(jù)預(yù)定規(guī)則對語法樹進行裁剪,獲取SQL語句的主干結(jié)構(gòu)特征,將其與知識庫進行匹配,匹配不成功跳轉(zhuǎn)至步驟408,否則跳轉(zhuǎn)至步驟405;
405.判定SQL語句合法,允許其通行;
406.SQL語句語法錯誤,判定該語句非法,產(chǎn)生報警信息。
407.訪問行為不合法,判定SQL語句非法,產(chǎn)生報警信息;
408.主干結(jié)構(gòu)不合法,判定SQL語句非法,產(chǎn)生報警信息。
5、根據(jù)權(quán)利要求3或者4所述的一種基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護方法,其特征在于,
所述學(xué)習(xí)階段步驟302或者過濾階段步驟402中,對SQL語句進行解析,產(chǎn)生SQL語法樹,具體解析包括詞法解析,語法解析以及語義解析。
6、根據(jù)權(quán)利要求3所述的一種基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護方法,其特征在于,
所述學(xué)習(xí)階段步驟303中,獲取該SQL語句涉及到的所有的數(shù)據(jù)庫對象以及對其的操作,數(shù)據(jù)庫對象類型包括表、列、視圖、別名;操作行為包括查詢、插入、修改、刪除、更新。
7、根據(jù)權(quán)利要求3所述的一種基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護方法,其特征在于,
所述學(xué)習(xí)階段步驟304中,根據(jù)預(yù)定規(guī)則對語法樹進行裁剪,獲取SQL語句的主干特征,裁剪過程負(fù)責(zé)將SQL語句中用戶輸入部分用通配符進行替換。
8、根據(jù)權(quán)利要求3所述的一種基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護方法,其特征在于,
所述學(xué)習(xí)階段步驟305中,將所有不同的特征進行分類統(tǒng)計加入知識庫,加入知識庫的過程中需要將該特征與現(xiàn)有的知識庫進行匹配,如果匹配成功說明存在相同特征,不需要加入,否則將該特征加入相應(yīng)位置。
9、根據(jù)權(quán)利要求4所述的一種基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護方法,其特征在于,
所述過濾階段步驟403中,將訪問行為特征與知識庫進行匹配,匹配過程包括如下步驟
901.對SQL語法樹進行分析,獲取訪問行為,具體包括涉及數(shù)據(jù)庫訪問對象以及對其的操作;
902.計算數(shù)據(jù)庫對象名的HASH值,以HASH值為索引,找出相同數(shù)據(jù)庫對象名稱,如果存在相同數(shù)據(jù)庫對象則跳至步驟903進行行為匹配,否則跳至步驟904;
903.比較該對象的操作行為,如果存在該行為則跳至步驟906,否則跳至步驟905;
904.匹配不成功,返回原因不存在相同數(shù)據(jù)庫對象;
905.匹配不成功,返回原因數(shù)據(jù)對象的操作不合法;
906.匹配成功,返回。
10、根據(jù)權(quán)利要求4所述的一種基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護方法,其特征在于,
所述過濾階段步驟404中,將SQL主干結(jié)構(gòu)特征與知識庫進行匹配,匹配過程包括如下步驟
1001.對解析后SQL語法樹進行裁剪,形成規(guī)范語法樹;
1002.計算語法樹的兩棵不同的子樹的HASH值hash1、hash2;
1003.以hash1為索引,進行查找,如果存在相同ha sh值則跳至步驟1004,否則跳至步驟1006;
1004.找出hash1相同的語法樹,比較hash2,相同則跳至步驟1005,否則跳至步驟1006;
1005.匹配成功;
1006.匹配失敗。
全文摘要
本發(fā)明公開了一種基于自學(xué)習(xí)的數(shù)據(jù)庫SQL注入防護方法,包括學(xué)習(xí)階段和過濾階段。學(xué)習(xí)階段工作在安全環(huán)境下,此時所有的SQL語句都是由應(yīng)用系統(tǒng)產(chǎn)生的合法SQL語句,通過對這些語句進行解析,基于解析結(jié)果,分析并統(tǒng)計它們的特征,從而構(gòu)建一個合法SQL語句的知識模型(知識庫);過濾階段工作在現(xiàn)實環(huán)境中,此時假設(shè)所有的SQL語句都可能是非法SQL語句,將這些語句與安全環(huán)境下建立的知識庫進行模式匹配,匹配成功則為合法的SQL語句,否則為非法SQL語句。本發(fā)明的有益效果是基于學(xué)習(xí)合法SQL語句的SQL注入防護系統(tǒng)能夠大幅減少傳統(tǒng)SQL注入防護產(chǎn)生的誤報率以及漏報率,提高整個系統(tǒng)的防御能力。
文檔編號G06N99/00GK101609493SQ200910181290
公開日2009年12月23日 申請日期2009年7月21日 優(yōu)先權(quán)日2009年7月21日
發(fā)明者林為民, 濤 張, 楊維永, 唐汗青, 石聰聰, 浩 陳, 昊 秦 申請人:國網(wǎng)電力科學(xué)研究院, 南京南瑞集團公司