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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章