如何編寫安全的SQL數據庫代碼?
Michael Cobb是認證信息系統安全架構專家(CISSP-ISSAP),知名的安全作家,具有十多年豐富的IT行業經驗,并且還從事過十六年的金融行業。他是 Cobweb Applications公司的創始人兼常務董事,該公司主要提供IT培訓,以及數據安全和分析的支持。
問:我們正在全力打造一個安全的SQL數據庫。對于如何為此類數據庫編寫更安全的代碼,您有什么建議嗎?
答:在編寫安全的SQL數據庫代碼時,您的首要任務是要了解你需要保護什么樣的數據、為什么要保護這些數據,以及為了保護它們您將要面對的是什么。這將有助于確保您能構建一個適當的、滿足您需要的、具有特定功能和特性的安全控制機制。而在數據庫設計階段,您就應當進行此項分析。在分析中,識別和評估風險的過程被稱為威脅建模(threat modeling)。
在威脅建模過程中,為了確定數據庫的潛在威脅,需要對數據庫存儲和處理的信息進行分類。這將需要您的安全維護人員和數據庫開發者從攻擊者的角度來共同分析數據庫。該過程不僅能幫助大家了解黑客攻擊數據庫的原因和方式,還能確保必要的安全控制能夠盡早適應數據庫的設計結構。同時,該過程還會創建一系列文件,以識別和調整數據庫的安全需求。
目前,對數據庫最大的威脅是SQL注入攻擊,因此您進行防護的關鍵是采用參數化存儲過程。這種方法要求使用參數和用戶定義的子程序對數據庫進行操作,而不是使用那些由用戶直接給定的值創建命令。SQL參數不僅是類型安全(type safe)的,而且還能大幅降低SQL注入攻擊的成功率。此外,SQL參數還能作為一種控制訪問數據庫的手段。
在編寫數據庫程序的代碼時,應當假設所有傳遞給它們的數據都來自于未受信任的來源。這意味著,所有的數據庫程序都應驗證那些等待處理數據的類型、長度、格式和范圍。許多開發人員采用過濾已知的不安全字符的方法來凈化輸入數據,但這樣做并不是很有效,因為惡意用戶通常能找到其它方法來繞過這種驗證。另一種辦法是,編寫驗證程序來檢查所有已知的安全可靠的輸入數據,除此之外的任何數據都應當予以拒絕。數據庫應當記錄這些處理結果,但不要將任何系統信息包含在出錯消息中返回給調用該數據庫的應用程序或用戶,因為這些系統信息可能對攻擊者有用。
在編寫代碼時,您需要對您的開發人員進行培訓,讓他們時刻將安全性考慮在內。這種培訓實際上并沒有聽起來那么花錢。因為在互聯網上有許多出色的免費Web應用程序開發論壇和在線教程。這一領域的領導者之一是開源Web應用程序安全計劃(Open Web Application Security Project,OWASP),其中有很多關于如何編寫更為安全的代碼的范例。即使您的開發人員可以編寫出健壯的代碼,他們仍須用動態和靜態分析來檢測這些代碼在技術上和邏輯上的漏洞。
靜態分析是指在不執行應用程序本身的情況下審查其源代碼;而動態分析則揭示了應用程序在運行時的自身行為以及它與其他程序和操作系統交互的情況。在此需要提醒注意的是,在測試一個新系統時,您絕不應當使用真實的客戶數據。最后,在開發和部署數據庫時,切勿只依賴您的開發人員來保證數據的安全,你還需要一個深度防御戰略來阻止可能發起攻擊的黑客。您的網絡管理員應當確保任何通過Web應用程序訪問數據庫的賬戶都被授予了最低的訪問權限,并且在網絡傳輸過程中,敏感信息都是被加密的。