PHP SQL注入漏洞防範
在PHP中採用魔術引號進行過濾,但是PHP5.4之後被取消了,同時在遇到int型注入也不會那麼有效,所以用的最多的還是過濾函式和類(例如discuz,dedecms,phpcms),如果單純的過濾函式寫的不嚴謹,就會出現繞過的情況,最好的解決方法還是預編譯的方式。
GPC/runtime魔術引號
資料汙染有兩種方式,一種是應用被動接受引數,類似於GET,POST等,還有一種是主動獲取引數,類似於讀取遠端頁面或檔案等,GPC負責對GET,POST,COOKIE的值進行過濾,runtime對於從資料庫或者檔案中獲取的資料進行過濾
這兩個選項通常只能防護住部分SQL注入漏洞被利用,因為它們只對單引號,雙引號,反斜槓與空字元進行過濾,在int型的注入上市沒有多大作用的
過濾函式和類
- addslashes
過濾的值範圍和GPC是一樣的,即單引號 雙引號 反斜槓 空字元,它只是一個簡單的檢查引數的函式,大多數程式使用它是在程式的入口,進行判斷如果沒有開啟GPC,則使用它對$_POST/$_GET等變數進行過濾,不過它的引數值必須是string型別。
$str=”phpsafe'”;
echo addslashes($str);
結果:
phpsafe\’
- mysql_real_escape_string:
mysql_escapde_string和mysql_real_escape_string函式都是對字串進行過濾,[\x00][\n][\r][\][‘][“][\x1a]等字元會受到影響。
兩個函式唯一不一樣的地方在於mysql_real_escape_string接受的是一個連線控制代碼並根據當前字符集轉義字串,所以推薦使用mysql_real_escape_string
- intval字元轉換
上面的過濾方式在遇到int型別注入的時候效果並不好,可以通過報錯或者盲注等方式來繞過,intval方式可以將變數轉化成int型別,利用引數白名單的方式來防止漏洞,對應的還有其他的方式例如floatval等等
$id = intval(“1 union select”);
echo $id;
結果:1