概念
SQL注入攻擊(SQL Injection)辅肾,簡稱注入攻擊角溃,是Web開發(fā)中最常見的一種安全漏洞肚逸【郏可以用它來從數(shù)據(jù)庫獲取敏感信息啤它,或者利用數(shù)據(jù)庫的特性執(zhí)行添加用戶断箫,導(dǎo)出文件等一系列惡意操作网棍,甚至有可能獲取數(shù)據(jù)庫乃至系統(tǒng)用戶最高權(quán)限兼蜈。
而造成SQL注入的原因是因為程序沒有有效過濾用戶的輸入通孽,使攻擊者成功的向服務(wù)器提交惡意的SQL查詢代碼序宦,程序在接受后錯誤的將攻擊者的輸入作為查詢語句的一部分執(zhí)行,導(dǎo)致原始的查詢邏輯被改變背苦,額外的執(zhí)行了攻擊者精心構(gòu)造的惡意代碼互捌。
預(yù)防SQL注入
也許你會說攻擊者要知道數(shù)據(jù)庫結(jié)構(gòu)的信息才能實施SQL注入攻擊潘明。確實如此,但沒人能保證攻擊者一定拿不到這些信息秕噪,一旦他們拿到了钳降,數(shù)據(jù)庫就存在泄露的危險。如果你在用開放源代碼的軟件包來訪問數(shù)據(jù)庫腌巾,攻擊者就容易得到相關(guān)的代碼遂填。如果這些代碼設(shè)計不良的話,風險就更大了澈蝙。
這些攻擊總是發(fā)生在安全性不高的代碼上吓坚。所以,永遠不要信任外界輸入的數(shù)據(jù)灯荧,特別是來自于用戶的數(shù)據(jù)礁击,包括選擇框、表單隱藏域和cookie漏麦。
SQL注入攻擊的危險這么大客税,那么該如何來防治呢?下面這些建議或許對防治SQL注入有一定的幫助撕贞。
- 嚴格限制Web應(yīng)用的數(shù)據(jù)庫的操作權(quán)限更耻,給此用戶提供僅僅能夠滿足其工作的最低權(quán)限,從而最大限度的減少注入攻擊對數(shù)據(jù)庫的危害捏膨。
- 檢查輸入的數(shù)據(jù)是否具有所期望的數(shù)據(jù)格式秧均,嚴格限制變量的類型,例如使用regexp包進行一些匹配處理号涯,或者使用strconv包對字符串轉(zhuǎn)化成其他基本類型的數(shù)據(jù)進行判斷目胡。
- 對進行數(shù)據(jù)庫的特殊字符(“\ < &”,等)進行轉(zhuǎn)義處理链快,或編碼轉(zhuǎn)換誉己。
- 所有的查詢語句建議使用數(shù)據(jù)庫提供的參數(shù)化查詢接口,參數(shù)化的語句使用參數(shù)而不是將用戶輸入變量嵌入到SQL語句中域蜗,即不要直接拼接SQL語句巨双。
- 在應(yīng)用發(fā)布之前建議使用專業(yè)的SQL注入檢測工具進行檢測,以及時修補被發(fā)現(xiàn)的SQL注入漏洞霉祸。
- 避免網(wǎng)站打印出SQL錯誤信息筑累,比如類型錯誤、字段不匹配等丝蹭,把代碼里的SQL語句暴露出來慢宗,以防止攻擊者利用這些錯誤信息進行SQL注入。