首先說說sql注入攻擊的模式,基本上都是后台在接受前端傳遞的參數的時候將sql代碼或腳本代碼混入到提交信息中,如果在接受提交的參數的時候沒有做精確的數據驗證,很可能就讓別人鑽了空子;輕則暴庫,重則數據庫數據都會被刪;
所以想要預防sql注入, 關鍵是程序員寫的代碼一定要嚴謹,對數據做嚴格的驗證,數據類型,長度,正則等都可以做;
http://hudeyong926.iteye.com/blog/703074這個里面驗證規則可以參考;
在做防止sql注入的時候需要按照你傳入參數的類型進行過濾,理論上只要不符合你傳遞的參數類型的數據應該全部過濾掉,可以寫多個函數封裝起來,用到這個過濾就調用這個函數;這樣靈活性更高;
1、正則表達式過濾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、數據長度驗證
如果能確定你的傳入數據的長度,當然可以做一個簡單判斷, 不過一般情況直接使用正則表達式判斷, 不僅能匹配數據長度, 還能精確的匹配數據類型和參數格式等,所以正則表達式還是很方便高效的;
4、特殊字符替換
這個問題可能存在當用戶輸入',",%等的時候, sql誤以為是特殊字符,執行的時候語句就報錯或是查詢的結果不對;這就需要str_replace()函數做字符串特定字符的替換,
比如str_resplace(''','\'',$str);,這樣就會把$str中的'號轉成\';這樣sql在執行的時候就會把'當做'去處理,不然會以為是字符串分界符;這樣就會報錯了,%其實也是一樣,%在sql中是模糊查詢,如果做了轉義處理,sql就會認為是%這個字符,不做模糊查詢處理;當然php也有函數去處理引號轉義處理的,addslashes()函數就是做這個事情的,另外php配置文件中有一個magic_quotes_gpc()這個配置如果設置為on,則php在接受參數的時候, 會自動的給',",\,null加上\進行轉義;具體詳細使用方法我這里就不多說了, 前面的鏈接里面也是有的, 百度也很容易查到;
先就總結這幾點吧 , 后面用到別的再加;
