■新疆 崔良義
隨著信息技術(shù)的不斷發(fā)展,網(wǎng)絡(luò)信息安全問(wèn)題日益突出。本文闡述了SQL 注入對(duì)應(yīng)用程序的安全隱患,最后提出了一些有效的防御措施。
SQL 注入,存在于大多數(shù)具有數(shù)據(jù)庫(kù)且?guī)в袇?shù)的網(wǎng)站中,具有隱蔽性,危害性極大等特點(diǎn)。攻擊者往往通過(guò)不斷嘗試尋找注入點(diǎn),然后構(gòu)造惡意SQL 語(yǔ)句,將語(yǔ)句發(fā)送給數(shù)據(jù)庫(kù)管理系統(tǒng),從而達(dá)到非法查看或修改數(shù)據(jù)的目的。例如,假設(shè)已發(fā)現(xiàn)網(wǎng)站www.test.com/index.php?id=1 存在SQL 注入,通過(guò)order by 來(lái)猜測(cè)數(shù)據(jù)庫(kù)的字段數(shù),當(dāng)字段數(shù)等于3 時(shí)數(shù)據(jù)庫(kù)返回錯(cuò)誤信息,那么,我們可以進(jìn)一步查詢出數(shù)據(jù)庫(kù)的隱私信息。
顯然,SQL 注入產(chǎn)生的主要原因就是未經(jīng)檢查的用戶輸入數(shù)據(jù),被惡意構(gòu)造成了可執(zhí)行的代碼,產(chǎn)生了開(kāi)發(fā)者預(yù)期之外的動(dòng)作。因而,我們可以從以下幾方面加強(qiáng)預(yù)防。
圖1 采用SQL 語(yǔ)句預(yù)編譯和綁定變量
通過(guò)使用WAF 等專(zhuān)業(yè)的防護(hù)軟件系統(tǒng)過(guò)濾用戶輸入的非法參數(shù)。例如,union、and、insert、select、delete、update、mid、or、#等關(guān)鍵字符串的過(guò)濾,確保用戶輸入數(shù)據(jù)的合法性,這樣就可以盡可能的防御SQL注入語(yǔ)句的輸入。
攻擊者為了找到SQL 注入點(diǎn),通常會(huì)通過(guò)輸入非法字符串來(lái)獲取服務(wù)器返回的報(bào)錯(cuò)信息。如果目標(biāo)Web 網(wǎng)站開(kāi)啟了默認(rèn)錯(cuò)誤顯示,攻擊者就可通過(guò)查看頁(yè)面的錯(cuò)誤信息推測(cè)出Web網(wǎng)站使用的數(shù)據(jù)庫(kù)和開(kāi)發(fā)語(yǔ)言等重要信息。因此,程序員應(yīng)關(guān)閉Webserver 錯(cuò)誤提示,或自定義錯(cuò)誤頁(yè)面。對(duì)于PHP頁(yè)面,可將配置文件php.ini中的display_errors 設(shè)置為Off 即可關(guān)閉錯(cuò)誤提示。
例如,采用Prepared Statement 將 SQL 語(yǔ)句“select id,name from user where id=1”預(yù)先編譯好,即通過(guò)SQL 引擎預(yù)先進(jìn)行語(yǔ)法分析,產(chǎn)生語(yǔ)法樹(shù),生成執(zhí)行計(jì)劃;這樣后面無(wú)論你輸入什么參數(shù),都不會(huì)影響該SQL語(yǔ)句的語(yǔ)法結(jié)構(gòu)了,執(zhí)行代碼如圖1 所示。
做好數(shù)據(jù)庫(kù)賬號(hào)和權(quán)限的管理,并嚴(yán)格加密處理用戶的機(jī)密信息,防止泄露。對(duì)用戶輸入的數(shù)據(jù)進(jìn)行加密處理,再跟數(shù)據(jù)庫(kù)中數(shù)據(jù)比較,從而防止被SQL注入。
SQL 注入是當(dāng)前普遍使用的一種Web 攻擊手段,一旦被黑客注入成功,輕則造成非法獲取數(shù)據(jù)庫(kù)信息,重則直接篡改數(shù)據(jù)庫(kù)內(nèi)容,甚至破壞程序文件造成服務(wù)器宕機(jī),給企業(yè)帶來(lái)巨大損失。
因此,作為一名合格的程序員,應(yīng)在編寫(xiě)程序代碼時(shí),嚴(yán)格做好SQL 注入防御措施,并建議企業(yè)采購(gòu)專(zhuān)業(yè)的服務(wù)器漏洞掃描工具及WAF 等防護(hù)軟件,從而為服務(wù)器多增加一層安全防范堡壘。