吳濤 張俊
摘要:隨著互聯(lián)網(wǎng)的發(fā)展,基于 Web 服務(wù)器語(yǔ)言和后臺(tái)數(shù)據(jù)庫(kù)模式的網(wǎng)站存在安全性問(wèn)題,其中SQL注入數(shù)據(jù)庫(kù)是最具威脅B/S系統(tǒng)漏洞的攻擊。該文分析了SQL注入原理及特點(diǎn),研究了預(yù)防 SQL注入的攻擊方法,針對(duì)B/S系統(tǒng)的特點(diǎn),提出了字段檢查、注入測(cè)試、服務(wù)器加固、綁定變量和禁止字符串拼接等SQL注入的防治手段,對(duì)預(yù)防SQL注入提供了有效的方法,增加了B/S系統(tǒng)的安全性。
關(guān)鍵詞:SQL注入;B/S架構(gòu);WEB安全
中圖分類(lèi)號(hào):TP393? ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2020)02-0007-02
Abstract: with the development of Internet, there are security problems in Web sites Based on Web server language and background database mode, among which SQL injection database is the most dangerous attack to B/S system vulnerability. This paper analyzes the principle and characteristics of SQL injection, studies the methods to prevent SQL injection. According to the characteristics of B/S system, it puts forward the prevention measures of SQL injection, such as field check, injection test, server reinforcement, binding variables and forbidding string splicing. It provides an effective method to prevent SQL injection and increases the security of B/S system.
Key words: SQL injection; B/S architecture; Web Security
由于網(wǎng)絡(luò)的快速發(fā)展,B/S系統(tǒng)的功能越來(lái)越強(qiáng)大。B/S系統(tǒng)通過(guò)瀏覽器即可進(jìn)行訪(fǎng)問(wèn),十分便捷。同時(shí)B/S系統(tǒng)也伴隨著各方面的安全性問(wèn)題,其中SQL注入是一個(gè)很敏感的漏洞,其特點(diǎn)是在用戶(hù)輸入或者信息上傳時(shí),將惡意數(shù)據(jù)或者代碼上傳到 WEB 應(yīng)用系統(tǒng)中,導(dǎo)致系統(tǒng)崩潰、獲取敏感信息等惡劣行為。SQL 注入攻擊的技術(shù)門(mén)檻低、隱蔽性強(qiáng)、危害性大、殺毒軟件也無(wú)法查殺,一旦若獲取網(wǎng)站 Web Shell 權(quán)限,便可上傳網(wǎng)頁(yè)木馬、控制整站等違法操作。本文針對(duì)SQL注入原理及特點(diǎn),提出了字段檢查、注入測(cè)試、服務(wù)器加固和綁定變量等有效的防治手段,旨在增強(qiáng)B/S系統(tǒng)的安全性。
1 SQL注入的原理和方法
SQL注入就是通過(guò)輸入域或頁(yè)面請(qǐng)求的查詢(xún)字符串,欺騙服務(wù)器執(zhí)行惡意的SQL命令[1],從而獲得數(shù)據(jù),對(duì)數(shù)據(jù)庫(kù)進(jìn)行破壞等操作,最終達(dá)到控制整個(gè)服務(wù)器的目的。典型的SQL注入分為兩類(lèi),分別是數(shù)據(jù)庫(kù)平臺(tái)注入和應(yīng)用層注入(WEB應(yīng)用層)。數(shù)據(jù)庫(kù)平臺(tái)注入往往是存在惡意攻擊數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)平臺(tái)的注入就需要數(shù)據(jù)庫(kù)管理人員(DBA)對(duì)數(shù)據(jù)進(jìn)行全方位的管理,包括數(shù)據(jù)庫(kù)的配置,數(shù)據(jù)庫(kù)權(quán)限的管理等等,能夠在數(shù)據(jù)庫(kù)層面有效地杜絕SQL的注入;平臺(tái)注入就是典型的進(jìn)行發(fā)送請(qǐng)求字符串,構(gòu)成一些特殊的SQL語(yǔ)句(例如“selecr * from Student where from password = ‘xxx ‘ or 1 = 1”等),從而進(jìn)行系統(tǒng)的破壞或者獲得非法數(shù)據(jù)。由于SQL注入的信息和普通用戶(hù)訪(fǎng)問(wèn)的方式一模一樣,難以防御,所以SQL注入也成為B/S系統(tǒng)一個(gè)很?chē)?yán)重的安全問(wèn)題。典型的輸入域和請(qǐng)求查詢(xún)的時(shí)機(jī)如表1所示。
2 SQL注入的防治手段
2.1 進(jìn)行字段檢查
SQL注入時(shí)使用一些特殊的字符去拼接服務(wù)器后臺(tái)的SQL語(yǔ)句,常見(jiàn)是字符串拼接如表2所示。為了防止這種字符串的拼接,增加信息的安全性,我們可以對(duì)異常注入的信息建立一個(gè)云計(jì)算庫(kù),并定期對(duì)庫(kù)中的數(shù)據(jù)進(jìn)行管理、升級(jí)等等。從而到達(dá)數(shù)據(jù)的及時(shí)性。當(dāng)我們?cè)趫?zhí)行SQL語(yǔ)句的時(shí)候。自動(dòng)在庫(kù)中進(jìn)行匹配。若發(fā)現(xiàn)相似度高的、可疑的。發(fā)現(xiàn)問(wèn)題及時(shí)進(jìn)行反饋[2]。匹配具體流程如圖1所示。
2.2 進(jìn)行大規(guī)模的注入測(cè)試
SQL注入典型的攻擊有盲目注入,建表操作,跨表操作。對(duì)于盲目注入[3],就是攻擊對(duì)象去惡意猜測(cè)服務(wù)器端的錯(cuò)誤,用一些可能錯(cuò)誤的代碼進(jìn)行大量測(cè)試,最終達(dá)到竊取服務(wù)器數(shù)據(jù)的問(wèn)題。盲目注入又分為布爾盲注,時(shí)間盲注,延時(shí)盲注等,我們可以針對(duì)不同的盲注方式[4],在程序上線(xiàn)之前,對(duì)程序進(jìn)行嚴(yán)格的測(cè)試,以便發(fā)現(xiàn)問(wèn)題并解決問(wèn)題。
2.3 對(duì)數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行加固
對(duì)數(shù)據(jù)庫(kù)服務(wù)器端進(jìn)行加固,增加服務(wù)器的防火墻水平,對(duì)不同的用戶(hù)進(jìn)行不同的權(quán)限受理[5],這樣,一般的用戶(hù)就只能看到自己權(quán)限范圍內(nèi)的數(shù)據(jù),當(dāng)用戶(hù)進(jìn)行越級(jí)操作的時(shí)候,設(shè)置觸發(fā)機(jī)制,及時(shí)進(jìn)行反饋,檢查是否出現(xiàn)SQL注入問(wèn)題。提高數(shù)據(jù)庫(kù)的日志記錄級(jí)別,把日志記錄保存到獨(dú)立的物理磁盤(pán)上面,定期進(jìn)行檢查,發(fā)現(xiàn)疑似問(wèn)題及時(shí)進(jìn)行修復(fù)。
2.4 綁定變量
當(dāng)我們大規(guī)模使用SQL語(yǔ)句的時(shí)候,一條一條的SQL語(yǔ)句這樣的執(zhí)行,顯然就不滿(mǎn)足效率的要求了,我們可以對(duì)一段SQL語(yǔ)句進(jìn)行“聚集”化的操作,使一段SQL語(yǔ)句編程一個(gè)整體,就是綁定變量的方法,執(zhí)行的時(shí)候,就是一次性執(zhí)行完畢,這種方法雖然在一定程度上防止了SQL注入的風(fēng)險(xiǎn)。但是這種方式也存在一些弊端,額外的編碼過(guò)程就顯得十分的繁重,但是能夠避免SQL的安全性問(wèn)題,應(yīng)該進(jìn)行權(quán)衡,在進(jìn)行綁定變量的操作。
2.5 禁止使用字符串的拼接
數(shù)據(jù)庫(kù)中有兩種傳值符號(hào),一種是$(),作用是在進(jìn)行字符串拼接后,再由數(shù)據(jù)庫(kù)進(jìn)行編譯,通常使用JDBC中的Starement對(duì)象來(lái)進(jìn)行語(yǔ)句的執(zhí)行,在數(shù)據(jù)庫(kù)平臺(tái)中,對(duì)特殊字符的防范是很弱的,一旦變量進(jìn)入了數(shù)據(jù)庫(kù)系統(tǒng),很大程度上增加了SQL注入的風(fēng)險(xiǎn);一種是#(),這種被稱(chēng)為占位符,在進(jìn)行數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)的時(shí)候,先把SQL語(yǔ)句中需要拼接的字段通過(guò)特殊符號(hào)進(jìn)行占位,然后進(jìn)行數(shù)據(jù)庫(kù)的預(yù)編譯,預(yù)編譯完成之后,在對(duì)相應(yīng)字段進(jìn)行字符串的拼接,注入?yún)?shù)后,就不會(huì)在對(duì)SQL進(jìn)行編譯。通常配合JDBC中的prepareStatement來(lái)進(jìn)行預(yù)編譯;在數(shù)據(jù)庫(kù)的操作中,應(yīng)該禁止$()的使用,能夠有效地預(yù)防SQL的注入;#()和$()的區(qū)別如表3所示;
3 結(jié)束語(yǔ)
隨著B(niǎo)/S架構(gòu)的快速發(fā)展,服務(wù)器的安全性也顯得越來(lái)越重要,SQL注入可以繞過(guò)殺毒軟件的查殺,如果不增加特別的防護(hù),SQL注入將會(huì)竊取我們的數(shù)據(jù)。安全性不容忽視。本文介紹的字段檢查、注入測(cè)試、數(shù)據(jù)庫(kù)加固、綁定變量和禁止字符串拼接等,從各個(gè)方面闡述了預(yù)防SQL注入的方法,能夠有效地預(yù)防SQL的注入,保證用戶(hù)和公司的安全。
參考文獻(xiàn):
[1] 葉良艷. SQL注入漏洞檢測(cè)防御關(guān)鍵技術(shù)綜述[J]. 安徽電子信息職業(yè)技術(shù)學(xué)院學(xué)報(bào), 2018, 17(3):19-22.
[2] 葉夢(mèng)雄. 基于Web的SQL注入漏洞掃描系統(tǒng)的設(shè)計(jì)研究[J]. 電子設(shè)計(jì)工程, 2019, 27(16):20-23, 28.
[3] 王苗苗, 錢(qián)步仁, 許瑩瑩, 等. 基于通用規(guī)則的SQL注入攻擊檢測(cè)與防御系統(tǒng)的研究[J]. 電子設(shè)計(jì)工程, 2017, 25(5):24-28, 32.
[4] 高洪濤. SQL注入攻擊途徑及策略分析[J]. 網(wǎng)絡(luò)安全技術(shù)與應(yīng)用, 2011(3):14-16.
[5] 劉雪梅. 基于SQL Server數(shù)據(jù)庫(kù)的安全性對(duì)策探究[J]. 電腦編程技巧與維護(hù), 2019(9):96-98.
【通聯(lián)編輯:謝媛媛】