php mysql注入攻擊解決方案


  首先說說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加上\進行轉義;具體詳細使用方法我這里就不多說了, 前面的鏈接里面也是有的, 百度也很容易查到;

先就總結這幾點吧 , 后面用到別的再加;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM