標籤:
首先說說sql注入攻擊的模式,基本上都是後台在接受前端傳遞的參數的時候將sql代碼或指令碼代碼混入到提交資訊中,如果在接受提交的參數的時候沒有做精確的資料驗證,很可能就讓別人鑽了空子;輕則暴庫,重則資料庫資料都會被刪;
所以想要預防sql注入, 關鍵是程式員寫的代碼一定要嚴謹,對資料做嚴格的驗證,資料類型,長度,正則等都可以做;
http://hudeyong926.iteye.com/blog/703074這個裡面驗證規則可以參考;
在做防止sql注入的時候需要按照你傳入參數的類型進行過濾,理論上只要不符合你傳遞的參數類型的資料應該全部過濾掉,可以寫多個函數封裝起來,用到這個過濾就調用這個函數;這樣靈活性更高;
1、Regex過濾sql關鍵字,這個一般在傳參的時候肯定是不允許參數裡面帶這些資料的;
function inject_check($str1) {
//驗證傳入的參數中是否含有注入字元
return preg_match(‘/select|insert|and|or|update|delete|union|into|load_file|outfile|from|count\(|drop table|update|truncate|asc\(|mid\(|char\(|xp_cmdshell|exec|master|\/\*|\*|\.\.\/|\.\//i‘, $str1);
}
2、資料類型驗證
資料了類型就比較好判斷了, is_string()判斷是否是字串,is_numeric()判斷是否是數字;這裡需要注意一點,php是弱語言型程式設計語言,所以區分是否是數字和字串的時候需要注意一下,‘1‘和1其實是相等的, php會自動把數字型字串轉換成數字,但是如果在‘1‘外面套上雙引號如"‘1‘"這樣,它就是字串了;在做過濾的時候切記, 不然很容易犯錯;
3、資料長度驗證
如果能確定你的傳入資料的長度,當然可以做一個簡單判斷, 不過一般情況直接使用Regex判斷, 不僅能匹配資料長度, 還能精確的匹配資料類型和參數格式等,所以Regex還是很方便高效的;
4、特殊字元替換
這個問題可能存在當使用者輸入‘,",%等的時候, sql誤以為是特殊字元,執行的時候語句就報錯或是查詢的結果不對;這就需要str_replace()函數做字串特定字元的替換,
比如str_resplace(‘‘‘,‘\‘‘,$str);,這樣就會把$str中的‘號轉成\‘;這樣sql在執行的時候就會把‘當做‘去處理,不然會以為是字串分界符;這樣就會報錯了,%其實也是一樣,%在sql中是模糊查詢,如果做了轉義處理,sql就會認為是%這個字元,不做模糊查詢處理;當然php也有函數去處理引號轉義處理的,addslashes()函數就是做這個事情的,另外php設定檔中有一個magic_quotes_gpc()這個配置如果設定為on,則php在接受參數的時候, 會自動的給‘,",\,null加上\進行轉義;具體詳細使用方法我這裡就不多說了, 前面的連結裡面也是有的, 百度也很容易查到;
先就總結這幾點吧 , 後面用到別的再加;
php mysql注入攻擊解決方案