摘要:代碼編寫(xiě)需要防范SQL注入,本文將闡述如何防范SQL注入攻擊的方法及思路,能夠幫助編程人員減少代碼的SQL注入攻擊。
關(guān)鍵字:SQL;注入
一、SQL注入攻擊簡(jiǎn)介
SQL注入攻擊是目前出現(xiàn)最多的一種網(wǎng)絡(luò)攻擊手段,它的出現(xiàn),不是操作系統(tǒng)本身的問(wèn)題,而是由于程序員編寫(xiě)程序時(shí)出現(xiàn)的BUG,攻擊人員通過(guò)巧妙的程序輸入,就可以繞過(guò)本身合法的SQL驗(yàn)證或SQL語(yǔ)言相關(guān)條件,最終實(shí)現(xiàn)整個(gè)數(shù)據(jù)庫(kù)的所有數(shù)據(jù)的過(guò)程,也有不少數(shù)破壞者將數(shù)據(jù)販賣(mài),給社會(huì)及個(gè)人帶來(lái)極大的危險(xiǎn)和個(gè)人隱私信息的暴露。所以,程序員本身應(yīng)該格外注意SQL注入攻擊是如何發(fā)生的,在編寫(xiě)代碼中如何去防范SQL注入攻擊的發(fā)生。
二、SQL注入的攻擊的思路
SQL注入攻擊最常見(jiàn)的攻擊思路是首先先查找SQL注入的位置,整個(gè)程序在哪些位置出現(xiàn)了SQL注入的漏洞,第二步,通過(guò)巧妙的編寫(xiě)SQL語(yǔ)句,完成對(duì)操作系統(tǒng)及數(shù)據(jù)庫(kù)版本類(lèi)型的判斷,以判斷當(dāng)前數(shù)據(jù)庫(kù)是什么廠(chǎng)家,數(shù)據(jù)庫(kù)所在的操作系統(tǒng)是什么操作系統(tǒng),以便于我們實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出及其編寫(xiě)符合相應(yīng)產(chǎn)品的SQL語(yǔ)句。第三步,就是針對(duì)不同類(lèi)型的數(shù)據(jù)庫(kù)和操作系統(tǒng),進(jìn)行SQL注入攻擊。目前針對(duì)網(wǎng)站的SQL注入是最多的,也是最簡(jiǎn)單的一種攻擊方式,當(dāng)程序員在設(shè)計(jì)代碼時(shí),沒(méi)有充分考慮到對(duì)用戶(hù)輸入的字符串進(jìn)行過(guò)濾特殊字符,導(dǎo)致用戶(hù)輸入了經(jīng)過(guò)精心編寫(xiě)的一段SQL語(yǔ)句后,就可以完成數(shù)據(jù)的竊取。
三、代碼編寫(xiě)中SQL注入防范
我們?cè)诰帉?xiě)代碼時(shí)要自行分析源代碼中的漏洞,主要有兩種方法,靜態(tài)分析和動(dòng)態(tài)分析,靜態(tài)代碼分析是指分析源代碼,并不真正執(zhí)行代碼,只是去審核和分析源代碼。動(dòng)態(tài)分析是指在代碼的運(yùn)行過(guò)程中動(dòng)態(tài)調(diào)試的加以分析,找到漏洞。而我們通常結(jié)合地使用兩種方法用來(lái)防范我們的SQL注入攻擊。
從不可信任來(lái)源收到的數(shù)據(jù)是容易受到感染,這些函數(shù)通常用于執(zhí)行或涉及數(shù)據(jù)庫(kù)的SQL語(yǔ)句,我們?cè)诰帉?xiě)此類(lèi)函數(shù)或代碼時(shí)應(yīng)格外注意外來(lái)不可信任的數(shù)據(jù)輸入,每種程序語(yǔ)言均有很多種不同形式來(lái)構(gòu)造SQL語(yǔ)句,如果程序員沒(méi)有對(duì)輸入源,如表單、cookie、post變量等進(jìn)行篩查或驗(yàn)證,很有可能就存在SQL注入的漏洞。string id=tbx.text; DataTable?dt= SqlHelperCs.Execute(“select * from table where id=’”+id+”’”);以上代碼就是用戶(hù)直接將用戶(hù)控件的輸入值動(dòng)態(tài)的傳遞給了構(gòu)造SQL語(yǔ)句的函數(shù),并且該語(yǔ)句沒(méi)有對(duì)不可信輸入源進(jìn)行有效驗(yàn)證就被執(zhí)行,這很容易引發(fā)SQL注入漏洞。通常我們需要跟蹤變量的初始化來(lái)源,并且我們也要密切觀(guān)察此變量是否中途被修改,所以我們?cè)诖a編寫(xiě)時(shí)應(yīng)格外注意用戶(hù)輸入等易感染SQL注入的敏感區(qū)域,并使用一定的技巧來(lái)避免漏洞的可行性。想要構(gòu)造有效的SQL注入,必須首先搞清楚當(dāng)前數(shù)據(jù)庫(kù)注入類(lèi)型是數(shù)字還是字符串類(lèi)型,當(dāng)SQL注入攻擊為數(shù)字時(shí),是不需要加入單引號(hào)的,而其他類(lèi)型則是需要使用單引號(hào)的。使用帶數(shù)字值的SQL語(yǔ)句,例如:select * from table where id=1 使用帶字符串值的SQL語(yǔ)句則為select * from table where id=’1’ 從SQL注入攻擊時(shí),攻擊者非常注意的是使用字符串單引號(hào)的閉合問(wèn)題,所以我們?cè)诰帉?xiě)代碼時(shí),需要將特殊字符輸入給過(guò)濾掉,特別是單引號(hào),空格之類(lèi)的特殊輸入符號(hào)。我們可以將輸入的字符進(jìn)行正則表達(dá)式匹配,匹配特殊字符的正則表達(dá)式為((?=[\x21-\x7e]+)[^A-Za-z0-9])x21-\x7e]+) [^A-Za-z0-9])。而針對(duì)于數(shù)字輸入,經(jīng)常以AND 1=1 或 OR 1=1 的形式存在,所以我們又要對(duì)連續(xù)輸入的字符中不能包含SQL關(guān)鍵字為主要鑒別點(diǎn),屏蔽掉AND或OR或UNION或SELECT等等SQL關(guān)鍵字。
1.領(lǐng)域驅(qū)動(dòng)安全設(shè)計(jì)方法
領(lǐng)域驅(qū)動(dòng)安全設(shè)計(jì)方法是一種設(shè)計(jì)代碼的方法,以此設(shè)計(jì)的方法可以廣泛用于典型的SQL注入領(lǐng)域,并且它針對(duì)的是一種接收廣泛數(shù)據(jù)輸入安全設(shè)計(jì)方法。大多數(shù)的代碼編寫(xiě)過(guò)程中都會(huì)對(duì)輸入允許使用的字符類(lèi)型和長(zhǎng)度加以限制,但隨著程序的不斷演化和代碼增加,新添加的函數(shù)有可能會(huì)無(wú)意繞過(guò)了此類(lèi)驗(yàn)證,所以我們需要專(zhuān)門(mén)為代碼編寫(xiě)人員創(chuàng)建簡(jiǎn)單的模型,用來(lái)保證所涉及到此模式時(shí),都能夠顯示的去表達(dá)及檢驗(yàn)其有效性。通常我們以用戶(hù)名和密碼舉例,用戶(hù)名需要?jiǎng)?chuàng)建Username類(lèi),并且應(yīng)為public類(lèi)型,并且在類(lèi)中,我們對(duì)原始輸入的用戶(hù)名變量進(jìn)行封裝,在輸入時(shí)進(jìn)行正則表達(dá)式的非法輸入校驗(yàn),這樣做的好處是無(wú)論在代碼的任何位置,當(dāng)我們需要使用到用戶(hù)名時(shí),都可以使用Username類(lèi)的對(duì)象,由于該類(lèi)中變量是經(jīng)過(guò)有效性校驗(yàn)的,我們可以認(rèn)為它是有效性防止了SQL注入的變量,這樣做的好處是可以避免重復(fù)性的檢驗(yàn)邏輯,并且提高了團(tuán)隊(duì)安全防范意識(shí),我們只需要對(duì)關(guān)鍵輸入領(lǐng)域安全做好準(zhǔn)入校驗(yàn)即可,這就是領(lǐng)域驅(qū)動(dòng)安全的設(shè)計(jì)方法,追求公共資源的統(tǒng)一校驗(yàn)。
2、使用存儲(chǔ)過(guò)程防范注入
數(shù)據(jù)庫(kù)的存儲(chǔ)過(guò)程是應(yīng)用于數(shù)據(jù)庫(kù)的配置層來(lái)實(shí)現(xiàn)的,可以針對(duì)特定的數(shù)據(jù)庫(kù)用戶(hù)及相應(yīng)表,它會(huì)限制攻擊者拼湊特殊閉合性字符串,因?yàn)橹荒苷{(diào)用存儲(chǔ)過(guò)程,按要求傳入?yún)?shù),不符合參數(shù)數(shù)據(jù)庫(kù)控制層將會(huì)阻止并報(bào)錯(cuò)。存儲(chǔ)過(guò)程有助于減少潛在SQL注入攻擊,我們可以根據(jù)數(shù)據(jù)庫(kù)不同的版本,使用不同的存儲(chǔ)過(guò)程語(yǔ)言來(lái)編寫(xiě)存儲(chǔ)過(guò)程,Oracle的PL/SQL,SQL Server的Transact-SQL,以及MySQL的SQL2003標(biāo)準(zhǔn)。
參考文獻(xiàn):
[1]李博文.淺談SQL注入漏洞的檢測(cè)與防范[J].技術(shù)與市場(chǎng),2020,27(11):102-103.
[2]劉建亮,喬興華.SQL注入攻擊與防范之研究[J].科學(xué)技術(shù)創(chuàng)新,2020(08):24-25.
作者簡(jiǎn)介:薛凱,男,山東省青島市,1990年5月,本科,高級(jí)系統(tǒng)架構(gòu)師,軟件設(shè)計(jì)師,青島市黃島區(qū)人民醫(yī)院信息中心工作,主要從事軟件維護(hù)、軟件開(kāi)發(fā)
青島市黃島區(qū)人民醫(yī)院 信息中心?266400