PHP防SQL注入記錄

mysql注入歷來是php的一個問題,目前主要有以下幾種方案:
(1)addslashes函數
(2)mysql_escape_string 和mysql_real_escape_string 函數(將被廢棄或已被廢棄)
(3)magic_quotes_gpc自動過濾輸入(由於效率問題,5.4以後已被強制關閉,無法開啓)
(4)使用pdo/mysql驅動查詢,消除注入

看了網上的幾篇博文,大致知道了注入的基本原理:

通過提交的數據,篡改SQL語句,使得原來的mysql邏輯被篡改,繼而修改數據庫的數據或者獲取數據庫的數據;
一般有以下幾種注入攻擊:
1. 驗證注入:注入“and 1=1”;
2. 判斷字段數:
    (1)嵌入order by 1,2,3....直到報錯就知道總共字段數
    (2)UNION SELECT ...聯合查詢,不斷改變字段數目,直到正常查詢時,就是字段數了
3. 查詢庫名:在直到字段數的前提下,通過union select來查詢數據庫名字數據
4. 查表名:前提是查出庫名,原理同查詢庫名
5. 查字段:前提是查出表名,原理同查詢庫名
6. 查數據:前提是查出字段名,原理同查詢庫名

然後呢,防止注入的方法:

1. 對輸入字段進行過濾,如對敏感字符(如單引號,雙引號等)添加反斜槓
2. 使用參數化的過濾性語句(參數化配合mysql的預編譯還可以起到加速功能);
3. 避免使用解釋程序
4. 避免出現一些詳細的錯誤消息




注意:
1. addslashes和mysql_escape_string對於GBK編碼有漏洞,在GBK下當遇到單引號時,只是將將0xbf27修改爲0xbf5c27,還是沒將單引號轉義;

發佈了67 篇原創文章 · 獲贊 31 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章