在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