了解了SQL注入的方法后,如何能防止SQL注入?如何進一步防范SQL注入的泛濫?怎么通過一些合理的操作和配置來降低SQL注入的危險呢?
使用參數化的過濾性語句
要防御SQL注入,用戶的輸入就絕對不能直接被嵌入到SQL語句中。恰恰相反,用戶的輸入必須進行過濾,或者使用參數化的語句。參數化的語句使用參數而不是將用戶輸入嵌入到語句中。在多數情況中,SQL語句就得以修正。然后,用戶輸入就被限于一個參數。
輸入驗證
檢查用戶輸入的合法性,確信輸入的內容只包含合法的數據。數據檢查應當在客戶端和服務器端都執行之所以要執行服務器端驗證,是為了彌補客戶端驗證機制脆弱的安全性。
在客戶端,攻擊者完全有可能獲得網頁的源代碼,修改驗證合法性的腳本(或者直接刪除腳本),然后將非法內容通過修改后的表單提交給服務器。因此,要保證驗證操作確實已經執行,唯一的辦法就是在服務器端也執行驗證。你可以使用許多內建的驗證對象,例如Regular Expression Validator,它們能夠自動生成驗證用的客戶端腳本,當然你也可以插入服務器端的方法調用。如果找不到現成的驗證對象,你可以通過Custom Validator自己創建一個。
錯誤消息處理
防范SQL注入,還要避免出現一些詳細的錯誤消息,因為黑客們可以利用這些消息。要使用一種標準的輸入確認機制來驗證所有的輸入數據的長度、類型、語句、企業規則等。
加密處理
將用戶登錄名稱、密碼等數據加密保存。加密用戶輸入的數據,然后再將它與數據庫中保存的數據比較,這相當于對用戶輸入的數據進行了“消毒”處理,用戶輸入的數據不再對數據庫有任何特殊的意義,從而也就防止了攻擊者注入SQL命令。
存儲過程來執行所有的查詢
SQL參數的傳遞方式將防止攻擊者利用單引號和連字符實施攻擊。此外,它還使得數據庫權限可以限制到只允許特定的存儲過程執行,所有的用戶輸入必須遵從被調用的存儲過程的安全上下文,這樣就很難再發生注入式攻擊了。
使用專業的漏洞掃描工具
攻擊者們目前正在自動搜索攻擊目標并實施攻擊,其技術甚至可以輕易地被應用于其它的Web架構中的漏洞。企業應當投資于一些專業的漏洞掃描工具,如大名鼎鼎的Acunetix的Web漏洞掃描程序等。一個完善的漏洞掃描程序不同于網絡掃描程序,它專門查找網站上的SQL注入式漏洞。最新的漏洞掃描程序可以查找最新發現的漏洞。
確保數據庫安全
鎖定你的數據庫的安全,只給訪問數據庫的web應用功能所需的最低的權限,撤銷不必要的公共許可,使用強大的加密技術來保護敏感數據并維護審查跟蹤。如果web應用不需要訪問某些表,那么確認它沒有訪問這些表的權限。如果web應用只需要只讀的權限,那么就禁止它對此表的 drop 、insert、update、delete 的權限,并確保數據庫打了最新補丁。
安全審評
在部署應用系統前,始終要做安全審評。建立一個正式的安全過程,并且每次做更新時,要對所有的編碼做審評。開發隊伍在正式上線前會做很詳細的安全審評,然后在幾周或幾個月之后他們做一些很小的更新時,他們會跳過安全審評這關, “就是一個小小的更新,我們以后再做編碼審評好了”。請始終堅持做安全審評。