概念
SQL注入攻擊(SQL Injection),簡稱注入攻擊,是Web開發中最常見的一種安全漏洞。可以用它來從數據庫獲取敏感信息,或者利用數據庫的特性執行添加用戶,導出文件等一系列惡意操作,甚至有可能獲取數據庫乃至系統用戶最高權限。
而造成SQL注入的原因是因為程序沒有有效過濾用戶的輸入,使攻擊者成功的向服務器提交惡意的SQL查詢代碼,程序在接受后錯誤的將攻擊者的輸入作為查詢語句的一部分執行,導致原始的查詢邏輯被改變,額外的執行了攻擊者精心構造的惡意代碼。
預防SQL注入
也許你會說攻擊者要知道數據庫結構的信息才能實施SQL注入攻擊。確實如此,但沒人能保證攻擊者一定拿不到這些信息,一旦他們拿到了,數據庫就存在泄露的危險。如果你在用開放源代碼的軟件包來訪問數據庫,攻擊者就容易得到相關的代碼。如果這些代碼設計不良的話,風險就更大了。
這些攻擊總是發生在安全性不高的代碼上。所以,永遠不要信任外界輸入的數據,特別是來自于用戶的數據,包括選擇框、表單隱藏域和cookie。
SQL注入攻擊的危險這么大,那么該如何來防治呢?下面這些建議或許對防治SQL注入有一定的幫助。
- 嚴格限制Web應用的數據庫的操作權限,給此用戶提供僅僅能夠滿足其工作的最低權限,從而最大限度的減少注入攻擊對數據庫的危害。
- 檢查輸入的數據是否具有所期望的數據格式,嚴格限制變量的類型,例如使用regexp包進行一些匹配處理,或者使用strconv包對字符串轉化成其他基本類型的數據進行判斷。
- 對進行數據庫的特殊字符(“\ < &”,等)進行轉義處理,或編碼轉換。
- 所有的查詢語句建議使用數據庫提供的參數化查詢接口,參數化的語句使用參數而不是將用戶輸入變量嵌入到SQL語句中,即不要直接拼接SQL語句。
- 在應用發布之前建議使用專業的SQL注入檢測工具進行檢測,以及時修補被發現的SQL注入漏洞。
- 避免網站打印出SQL錯誤信息,比如類型錯誤、字段不匹配等,把代碼里的SQL語句暴露出來,以防止攻擊者利用這些錯誤信息進行SQL注入。