開發(fā)人員使數(shù)據(jù)庫面臨風(fēng)險(xiǎn)的十大方面
原創(chuàng)【51CTO獨(dú)家特稿】雖然這種對關(guān)鍵數(shù)據(jù)的簡易訪問已經(jīng)極大地提高了工作人員的效率,并提高了顧客的購買欲,但它也為關(guān)鍵數(shù)據(jù)庫打開了巨大的風(fēng)險(xiǎn)之門。不幸的是,許多風(fēng)險(xiǎn)是由缺乏資源的開發(fā)人員帶來的,他們往往無法得到足夠的時(shí)間、金錢、教育以及來自管理人員的支持,因而無法設(shè)計(jì)開發(fā)沒有漏洞的應(yīng)用程序。
在上述資源無法到位時(shí),開發(fā)人員往往會犯這些錯(cuò)誤:
1、過于相信輸入方法
當(dāng)今開發(fā)人員將數(shù)據(jù)庫置于風(fēng)險(xiǎn)之中的一種重要方法是,使其應(yīng)用程序遭受SQL注入攻擊。當(dāng)開發(fā)人員過于相信用戶輸入時(shí),就往往會出現(xiàn)SQL注入漏洞。
如果不對其進(jìn)行驗(yàn)證,例如,如果不驗(yàn)證一個(gè)只接受數(shù)字的電話號碼字段,開發(fā)者就有可能允許黑客對數(shù)據(jù)庫進(jìn)行終端訪問。例如,插入到表單域中的單引號有可能過早地關(guān)閉應(yīng)用程序本應(yīng)實(shí)施的合法SQL查詢,從而使攻擊者可以構(gòu)建并提交新的查詢。
解決這種問題的最好方法之一就是使用參數(shù)化查詢。
參數(shù)化查詢可以防止攻擊者改變查詢中的邏輯或代碼,并阻止大多數(shù)SQL注入攻擊。參數(shù)化查詢出現(xiàn)的時(shí)間就像數(shù)據(jù)庫一樣長,它不像安全的其它許多領(lǐng)域,使用參數(shù)化查詢也是保障性能和代碼可維護(hù)性的最佳方法。
但開發(fā)人員不應(yīng)當(dāng)停留于此。還要對用戶輸入進(jìn)行凈化和驗(yàn)證,因?yàn)橛袝r(shí)參數(shù)化并不可行。即使可行,攻擊者也可以將非驗(yàn)證的輸入用于其它惡意目的,如跨站腳本攻擊等。
最老套且最糟糕的問題是,不對用戶輸入進(jìn)行凈化,即在對數(shù)據(jù)庫運(yùn)行查詢之前,不剔除用戶輸入中并不需要的字符,例如不移除撇號或分號。
2、數(shù)據(jù)庫錯(cuò)誤消息顯示給終端用戶
在應(yīng)用程序的SQL查詢出現(xiàn)問題時(shí),如果開發(fā)人員允許彈出特定的錯(cuò)誤消息,這也許有助于診斷,但這也向攻擊者提供了一個(gè)探查后端數(shù)據(jù)庫的內(nèi)部工作機(jī)制的很好途徑。
通過得到的數(shù)據(jù)庫錯(cuò)誤消息,攻擊者就會了解數(shù)據(jù)庫的組織結(jié)構(gòu)和應(yīng)用程序查詢等許多重要信息,從而更容易展開攻擊。
錯(cuò)誤消息可以泄露關(guān)于應(yīng)用程序連接的數(shù)據(jù)庫類型、底層設(shè)計(jì)等的線索。
這種錯(cuò)誤會為盲目SQL注入攻擊打開大門,所以開發(fā)者應(yīng)當(dāng)在頁面顯示一般性的錯(cuò)誤消息而非特定消息。
3、輕率地對待口令
為了圖方便,許多開發(fā)者用多種不安全的方法來輕率地對待用戶口令。例如,他們可能將口令硬編碼到應(yīng)用程序中。
最明顯的數(shù)據(jù)庫風(fēng)險(xiǎn)之一在于硬編碼口令和存在于配置文件中的口令。這兩種設(shè)計(jì)選擇都依賴于這種脆弱的安全性,他們假定攻擊者不會訪問這種信息,因而開發(fā)者并不關(guān)心文件或其中信息的安全性。
同樣危險(xiǎn)的還有將口令存放到純文本中的方法,其中包括不對用戶輸入的口令進(jìn)行哈希,以及并不對哈希加鹽(加鹽:將隨機(jī)位添加到哈希中)。
此外,還有不健全的口令管理,沒有將強(qiáng)健的口令認(rèn)證構(gòu)建到應(yīng)用程序中。
4、使所有的連接都是“超級”的
同樣的,許多開發(fā)者通過“根”或其它一些超級用戶賬戶來將應(yīng)用程序連接到數(shù)據(jù)庫中,從而將數(shù)據(jù)庫置于風(fēng)險(xiǎn)之中。這通常是一個(gè)與硬編碼口令的應(yīng)用程序有關(guān)的問題,這是因?yàn)樵谶@些情況下很難實(shí)施適當(dāng)?shù)奶貦?quán)管理。
普通的應(yīng)用操作很少需要由“超級”特權(quán)所許可的訪問,允許應(yīng)用程序使用超級特權(quán)用戶,會為不適當(dāng)?shù)姆鞘跈?quán)活動創(chuàng)造機(jī)會。所有的應(yīng)用程序都應(yīng)當(dāng)使用最少特權(quán)的用戶憑證連接到數(shù)據(jù)庫。
5、相信存儲過程是SQL注入的解決之道
當(dāng)今的許多開發(fā)人員相信,存儲過程是防止SQL注入的一種可靠方法。
事實(shí)上,如果存儲過程自身的代碼中包含漏洞,或者如果存儲過程被以一種不安全的方式調(diào)用,它就并不能防止SQL注入。
在存儲過程中可以發(fā)生串的連接或并置。即使存儲過程的調(diào)用是準(zhǔn)備好的語句,如果在存儲過程自身內(nèi)部構(gòu)建和執(zhí)行查詢,它也有可能易遭受攻擊。
6、將調(diào)試代碼留放到生產(chǎn)環(huán)境中
正如廚師在做完了美味佳肴之后要打掃廚房一樣,開發(fā)人員必須在將程序投放到生產(chǎn)環(huán)境中之前,必須清理其代碼,以免打開數(shù)據(jù)庫的后門。導(dǎo)致這種后門最常見的且易被遺忘的要素是遺留到生產(chǎn)環(huán)境中調(diào)試代碼。
開發(fā)人員將后門放到程序中,其目的是為了調(diào)試,從而可以直接啟用數(shù)據(jù)庫的查詢。忘記在生產(chǎn)環(huán)境中清除這種調(diào)試代碼是愚蠢的,但也是很常見的錯(cuò)誤。
7、劣質(zhì)加密
比不使用加密更為糟糕的唯一問題是,錯(cuò)誤地使用加密,因?yàn)檫@這種加密給企業(yè)一種虛假的安全感。
問題存在于細(xì)節(jié)中,不管是一個(gè)哈希函數(shù)或是一個(gè)加密例程。如果你并不知道如何正確地實(shí)施加密,那就將任務(wù)委托給一位專家,并且不要過早地將應(yīng)用程序投放到生產(chǎn)環(huán)境中。
開發(fā)人員應(yīng)當(dāng)謹(jǐn)慎地對待其加密技術(shù)方面的技能和技巧。當(dāng)今的黑客喜歡本地的加密設(shè)計(jì),因?yàn)檫@種設(shè)計(jì)通常很差勁。
本地的加密幾乎不能給有經(jīng)驗(yàn)的攻擊者提供什么價(jià)值,并且會給企業(yè)帶來一種虛假的安全感。
8、盲目相信第三方代碼
使用第三方的代碼可能為開發(fā)人員節(jié)約大量的時(shí)間,但是開發(fā)人員不能在測試代碼問題上抄近路,以確保所復(fù)制的代碼不會給應(yīng)用程序帶來易受攻擊的代碼。
開發(fā)人員需要理解,自己要為整個(gè)應(yīng)用程序的威脅分析負(fù)責(zé),而不僅僅為自己編寫的代碼負(fù)責(zé)。
同樣地,如果開發(fā)者希望限制那些給數(shù)據(jù)庫帶來風(fēng)險(xiǎn)的漏洞數(shù)量,他們就應(yīng)當(dāng)使用最新的開發(fā)框架。
許多開發(fā)人員會使用WordPress、 Joomla或其它類型的應(yīng)用程序框架,卻沒有用最新的安全補(bǔ)丁保持其最新。許多類似的電腦都易遭受攻擊,應(yīng)用程序也如此。
9、輕率地實(shí)施REST(表述性狀態(tài)轉(zhuǎn)移)架構(gòu)
表述性狀態(tài)轉(zhuǎn)移(REST)架構(gòu)可能是一個(gè)有用的范例,但太多的工具會直接從數(shù)據(jù)庫生成REST接口,從而將接口與數(shù)據(jù)庫的設(shè)計(jì)架構(gòu)聯(lián)結(jié)起來,并可以暴露攻擊者能夠利用的信息。開發(fā)人員應(yīng)當(dāng)為一系列抽象的應(yīng)用程序的特定資源類型和資源的適當(dāng)操作設(shè)計(jì)REST接口,而不是把接口直接設(shè)計(jì)到物理的數(shù)據(jù)表和非特殊操作。
10、隨處亂放備份的數(shù)據(jù)庫副本
許多開發(fā)人員常常被責(zé)怪沒有在測試環(huán)境(在其中,開發(fā)者尋求測試其應(yīng)用程序的可選方式)中使用動態(tài)數(shù)據(jù)。不幸的是,這些編碼者的許多人會轉(zhuǎn)向備份數(shù)據(jù)庫。
網(wǎng)站可以很好地保護(hù)動態(tài)數(shù)據(jù)庫,但是否同樣保護(hù)好了自己的數(shù)據(jù)庫備份呢?在備份中,一周前的數(shù)據(jù)可能和動態(tài)數(shù)據(jù)一樣具有破壞力,開發(fā)者可能會使用備份來針對生產(chǎn)性數(shù)據(jù)測試其工作,所以開發(fā)環(huán)境必須小心地遵循生產(chǎn)環(huán)境中的安全標(biāo)準(zhǔn)。安全策略應(yīng)當(dāng)為數(shù)據(jù)的所有副本負(fù)責(zé),而不僅僅是在線副本。
【編輯推薦】