基于語(yǔ)義分析的智能防sql注入方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種防SQL注入方法,尤其涉及一種基于語(yǔ)義分析的智能防SQL注入方法。
【背景技術(shù)】
[0002]隨著B/S模式應(yīng)用開發(fā)的發(fā)展,使的采用這種模式編寫應(yīng)用程序的程序員也越來(lái)越多。但是這個(gè)行業(yè)的入門門檻不高,因而,程序員的水平及經(jīng)驗(yàn)也參差不齊,相當(dāng)大一部分的程序員在編寫代碼的時(shí)候,沒(méi)有對(duì)用戶輸入數(shù)據(jù)的合法性進(jìn)行判斷,使應(yīng)用程序存在安全隱患。加之,當(dāng)前SQL注入的軟件也有不少,SQL注入攻擊已成為黑客對(duì)數(shù)據(jù)庫(kù)進(jìn)行攻擊的常用手段之一。
[0003]所謂SQL注入,就是通過(guò)把SQL命令插入到Web表單遞交或輸入域名或頁(yè)面請(qǐng)求的查詢字符串,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令。用戶可以提交一段數(shù)據(jù)庫(kù)查詢代碼,根據(jù)程序返回的結(jié)果,獲得某些他想得知的數(shù)據(jù)。在這種攻擊方式中,攻擊者會(huì)將一些惡意代碼插入到字符串中。然后會(huì)通過(guò)各種手段將該字符串傳遞到SQL Server數(shù)據(jù)庫(kù)的實(shí)例中進(jìn)行分析和執(zhí)行。只要這個(gè)惡意代碼符合SQL語(yǔ)句的規(guī)則,則在代碼編譯與執(zhí)行的時(shí)候,就不會(huì)被系統(tǒng)所發(fā)現(xiàn)。
[0004]SQL注入是從正常的WWW端口訪問(wèn),而且表面看起來(lái)跟一般的Web頁(yè)面訪問(wèn)沒(méi)什么區(qū)別,所以目前市面的防火墻都不會(huì)對(duì)SQL注入發(fā)出警報(bào),如果管理員沒(méi)有查看IIS日志的習(xí)慣,可能被入侵很長(zhǎng)時(shí)間都不會(huì)發(fā)覺(jué)。
[0005]SQL注入式攻擊的主要形式有兩種。一是直接將代碼插入到與SQL命令串聯(lián)在一起并使得其以執(zhí)行的用戶輸入變量。由于其直接與SQL語(yǔ)句捆綁,故也被稱為直接注入式攻擊法。二是一種間接的攻擊方法,它將惡意代碼注入要在表中存儲(chǔ)或者作為原書據(jù)存儲(chǔ)的字符串。在存儲(chǔ)的字符串中會(huì)連接到一個(gè)動(dòng)態(tài)的SQL命令中,以執(zhí)行一些惡意的SQL代碼。
[0006]SQL注入攻擊危害程度是相當(dāng)嚴(yán)重的,SQL攻擊一般可以直接訪問(wèn)數(shù)據(jù)庫(kù)進(jìn)而甚至能夠獲得數(shù)據(jù)庫(kù)所在的服務(wù)器的訪問(wèn)權(quán)主要包括:對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的非法操作、盜取用戶的各中敏感信息、注入木馬等等。SQL注入訪問(wèn)是通過(guò)正常用戶端進(jìn)行的,一般只能通過(guò)程序來(lái)控制。
[0007]進(jìn)一步來(lái)看,一般SQL注入通過(guò)get和post兩種方式提交,因而一些通用的防注入方法中沒(méi)有對(duì)cookie數(shù)據(jù)進(jìn)行過(guò)濾,給黑客留下可乘之機(jī)。Cookie的優(yōu)勢(shì)在于管理員和注冊(cè)用戶登陸網(wǎng)站時(shí)Cookie會(huì)保存登陸信息,下次再登陸時(shí)Cookie會(huì)自動(dòng)將這些信息保留在登陸的頁(yè)面輸入文本框中,其作用是為了方便登陸者,但也給黑客采集Cookie的信息埋下了隱患。
【發(fā)明內(nèi)容】
[0008]本發(fā)明的目的就是為了解決現(xiàn)有技術(shù)中存在的上述問(wèn)題,提供一種基于語(yǔ)義分析的智能防SQL注入方法
本發(fā)明的目的通過(guò)以下技術(shù)方案來(lái)實(shí)現(xiàn):
基于語(yǔ)義分析的智能防SQL注入方法,其特征在于:首先,對(duì)來(lái)自網(wǎng)頁(yè)的所有請(qǐng)求進(jìn)行數(shù)據(jù)攔截或是數(shù)據(jù)提取,所述的數(shù)據(jù)出現(xiàn)為字符串,之后將提取到的數(shù)據(jù)送入安全中心進(jìn)行處理并返回結(jié)果,若數(shù)據(jù)有害,則跳轉(zhuǎn)到ShowErr頁(yè)面,若數(shù)據(jù)無(wú)害,則繼續(xù)進(jìn)行正常請(qǐng)求,所述的數(shù)據(jù)攔截為,通過(guò)Global, asax攔截所有的請(qǐng)求,所述的數(shù)據(jù)提取為,提取querystring、form、cookie中的數(shù)據(jù),之后,替換掉其中的轉(zhuǎn)義字符,根據(jù)預(yù)設(shè)判斷規(guī)則按順序逐條檢查,判斷這些數(shù)據(jù)是否有害。
[0009]上述的基于語(yǔ)義分析的智能防SQL注入方法,其中:根據(jù)預(yù)設(shè)判斷規(guī)則按順序逐條檢查過(guò)程為,首先,通過(guò)判斷字符串是否為完整的SQL語(yǔ)句;之后,判斷字符串是否為部分的SQL語(yǔ)句;接著,判斷字符串是否為數(shù)字型的SQL語(yǔ)句;最后,判斷字符串是否為邏輯短路型的SQL語(yǔ)句。
[0010]進(jìn)一步地,上述的基于語(yǔ)義分析的智能防SQL注入方法,其中:步驟①,判斷字符串中“一”的位置,然后截取“一”之前的字符串,不包括“一”,將方括號(hào)“[”和“]”替換為空格;
步驟②,以空格拆分,若拆分的數(shù)組長(zhǎng)度小于3,則為無(wú)害結(jié)束,反之則為有害,繼續(xù)運(yùn)行;
步驟③,去除多個(gè)空格,再次以空格拆分,若拆分的數(shù)組長(zhǎng)度小于3,則為無(wú)害結(jié)束,反之則為有害,繼續(xù)運(yùn)行,若拆分的數(shù)組等于3時(shí),處理誤攔截情況;
步驟④,采用TSqllOOParser判斷字符串是否為合法的SQL語(yǔ)句。
[0011]更進(jìn)一步地,上述的基于語(yǔ)義分析的智能防SQL注入方法,其中:所述的判斷字符串是否為部分的SQL語(yǔ)句的處理流程為,步驟①,判斷輸入字符串長(zhǎng)度是否小于3,若小于,則為無(wú)害結(jié)束,反之,則為有害,繼續(xù)運(yùn)行;
步驟②,去掉最后的空格,然后判斷是否為“’ ”號(hào)結(jié)尾,既取出第一個(gè)“’ ”的位置,然后取出最后一個(gè)“’ ”號(hào)的位置,若位置相同,則無(wú)害結(jié)束,反之,則為有害,繼續(xù)運(yùn)行;
步驟③,給輸入的字符串前面加入內(nèi)容為,SELECT * FROM USERS WHERE ID=的部分SQL語(yǔ)句,用TSqllOOParser判斷字符串是否為合法的SQL語(yǔ)句。
[0012]更進(jìn)一步地,上述的基于語(yǔ)義分析的智能防SQL注入方法,其中:所述的判斷字符串是否為數(shù)字型的SQL語(yǔ)句的處理流程為,
步驟①,判斷輸入字符串長(zhǎng)度是否小于5,若是,則為無(wú)害結(jié)束,反之,則為有害,繼續(xù)運(yùn)行;
步驟②,去掉兩端空格,以空格拆分,若拆分的數(shù)組長(zhǎng)度小于3,則為無(wú)害結(jié)束,反之有害,則繼續(xù)運(yùn)行。
[0013]步驟③,判斷第一個(gè)空格前面的字符串是否可轉(zhuǎn)換成Double類型,若是,則給輸入的字符串前面加入部分SQL語(yǔ)句,用TSqllOOParser判斷字符串是否為合法的SQL語(yǔ)句,若不是則判斷第一個(gè);號(hào)前面的字符串是否已轉(zhuǎn)換成Double類型,若是,則給輸入的字符串前面加入部分SQL語(yǔ)句,用TSqllOOParser判斷字符串是否為合法的SQL語(yǔ)句,若不是,則無(wú)害結(jié)束。
[0014]更進(jìn)一步地,上述的基于語(yǔ)義分析的智能防SQL注入方法,其中:所述的判斷字符串是否為邏輯短路型的SQL語(yǔ)句的處理流程為,
步驟①,判斷字符串中是否有單引號(hào),若有,則繼續(xù),若沒(méi)有,則結(jié)束;
步驟②,判斷是否只有一個(gè)單引號(hào),若不是,則繼續(xù),若是,則結(jié)束;
步驟③,以第一個(gè)單引號(hào)為界,把字符串分割成兩個(gè)部分,剔除第二部分任何單引號(hào),將把第一部分和第二部分合并,構(gòu)成新的字符串;
步驟④,在新的字符串前面加入部分SQL語(yǔ)句,采用TSqllOOParser判斷字符串是否為合法的SQL語(yǔ)句,若是,則為有害,將該條字符串放入有害池當(dāng)中,處理下一條字符串;若不是,則無(wú)害返回,處理下一條字符串,當(dāng)最后一條字符串處理完成時(shí),檢查有害池中的有害字符串條數(shù),返回處理結(jié)果。
[0015]更進(jìn)一步地,上述的基于語(yǔ)義分析的智能防SQL注入方法,其中:所述的判斷字符串是否為邏輯短路型的SQL語(yǔ)句的處理流程為,
步驟①,判斷字符串中是否有單引號(hào),若有,則繼續(xù),若無(wú),則結(jié)束;
步驟②,判斷是否只有一個(gè)單引號(hào),若不是,則繼續(xù),若是,則結(jié)束;
步驟③,設(shè)第一個(gè)單引號(hào)為界,將字符串分割成兩個(gè)部分,剔除第二部分任何單引號(hào)后,將第一部分和第二部分合并;
步驟④,在合并后的字符串前面加入部分SQL語(yǔ)句,用TSqllOOParser判斷字符串是否為合法的SQL語(yǔ)句,如若不是,則無(wú)害結(jié)束,若是,則將該條字符串放入有害池當(dāng)中,處理下一條