1. 程式人生 > >PHP SQL注入漏洞防範

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