PHP獲取IP地址的方法,防止偽造IP地址注入攻擊
PHP獲取IP地址的方法
/** * 獲取客戶端IP地址 * <br />來源:ThinkPHP * <br />"X-FORWARDED-FOR" 是代理伺服器通過 HTTP Headers 提供的客戶端IP。代理伺服器可以偽造任何IP。 * <br />要防止偽造,不要讀這個IP即可(同時告訴使用者不要用HTTP 代理)。 * @param integer $type 返回型別 0 返回IP地址 1 返回IPV4地址數字 * @param boolean $adv 是否進行高階模式獲取(有可能被偽裝) * @return mixed */ function get_client_ip($type = 0, $adv = false) { $type = $type ? 1 : 0; static $ip = NULL; if ($ip !== NULL) return $ip[$type]; if ($adv) { if (isset($_SERVER[`HTTP_X_FORWARDED_FOR`])) { $arr = explode(`,`, $_SERVER[`HTTP_X_FORWARDED_FOR`]); $pos = array_search(`unknown`, $arr); if (false !== $pos) unset($arr[$pos]); $ip = trim($arr[0]); }elseif (isset($_SERVER[`HTTP_CLIENT_IP`])) { $ip = $_SERVER[`HTTP_CLIENT_IP`]; } elseif (isset($_SERVER[`REMOTE_ADDR`])) { $ip = $_SERVER[`REMOTE_ADDR`]; } } elseif (isset($_SERVER[`REMOTE_ADDR`])) { $ip = $_SERVER[`REMOTE_ADDR`]; } // IP地址合法驗證, 防止通過IP注入攻擊 $long = sprintf("%u", ip2long($ip)); $ip = $long ? array($ip, $long) : array(`0.0.0.0`, 0); return $ip[$type]; } /** * 獲得使用者的真實IP地址 * <br />來源:ecshop * <br />$_SERVER和getenv的區別,getenv不支援IIS的isapi方式執行的php * @access public * @return string */ function real_ip() { static $realip = NULL; if ($realip !== NULL) { return $realip; } if (isset($_SERVER)) { if (isset($_SERVER[`HTTP_X_FORWARDED_FOR`])) { $arr = explode(`,`, $_SERVER[`HTTP_X_FORWARDED_FOR`]); /* 取X-Forwarded-For中第一個非unknown的有效IP字串 */ foreach ($arr AS $ip) { $ip = trim($ip); if ($ip != `unknown`) { $realip = $ip; break; } } } elseif (isset($_SERVER[`HTTP_CLIENT_IP`])) { $realip = $_SERVER[`HTTP_CLIENT_IP`]; } else { if (isset($_SERVER[`REMOTE_ADDR`])) { $realip = $_SERVER[`REMOTE_ADDR`]; } else { $realip = `0.0.0.0`; } } } else { if (getenv(`HTTP_X_FORWARDED_FOR`)) { $realip = getenv(`HTTP_X_FORWARDED_FOR`); } elseif (getenv(`HTTP_CLIENT_IP`)) { $realip = getenv(`HTTP_CLIENT_IP`); } else { $realip = getenv(`REMOTE_ADDR`); } } // 使用正則驗證IP地址的有效性,防止偽造IP地址進行SQL隱碼攻擊 preg_match("/[d.]{7,15}/", $realip, $onlineip); $realip = !empty($onlineip[0]) ? $onlineip[0] : `0.0.0.0`; return $realip; }
X-Forwarded-For地址形式列舉:
unkonwn, unknown, 211.100.22.30
172.16.20.110, 202.116.64.196, 203.81.21.61
10.194.75.83, 10.194.73.11, 10.194.71.11, unknown
192.168.120.57, unknown, unknown, 211.10.10.195
unknown, 210.75.1.181
155.161.59.47, unknown
偽造IP地址進行注入攻擊:
IP偽造有幾種途徑,一種是通過是修改IP資料包,有興趣的可以去看看IP資料包的結構,還有一種就是利用修改http頭資訊來實現IP偽造。涉及到“客戶端”IP的通常使用3個環境變數:$_SERVER[`HTTP_CLIENT_IP`]和$_SERVER[`X_FORWARDED_FOR`]還有$_SERVER[`REMOTE_ADDR`]實際上,這3個環境變數都有侷限性。前兩個是可以隨意偽造。只要在傳送的http頭裡設定相應值就可以,任意字元都可以,而第3個環境變數,如果使用者使用了匿名代理,那這個變數顯示的就是代理IP。
一般獲取IP後更新到資料庫程式碼如:$sql=”update t_users set login_ip=`”.get_client_ip().”` where …”,而如果接收到的ip地址是:xxx.xxx.xxx.xxx`;delete from t_users;– ,代入引數SQL語句就變成了:”update t_users set login_ip=`xxx.xxx.xxx.xxx`;delete from t_users;– where …
所以獲取IP地址後,務必使用正則等對IP地址的有效性進行驗證,另外一定要使用引數化SQL命令!
總結:
“X-FORWARDED-FOR” 是代理伺服器通過 HTTP Headers 提供的客戶端IP。代理伺服器可以偽造任何IP。
要防止偽造,不要讀這個IP即可(同時告訴使用者不要用HTTP 代理)。
如果是PHP,$_SERVER[`REMOTE_ADDR`] 就是跟你伺服器直接連線的IP,用這個就可以了。
獲取伺服器IP地址:
/** * 獲取服務端IP地址 * @return string * @since 1.0 2016-7-1 SoChishun Added. */ function get_host_ip() { return isset($_SERVER[`HTTP_X_FORWARDED_HOST`]) ? $_SERVER[`HTTP_X_FORWARDED_HOST`] : (isset($_SERVER[`HTTP_HOST`]) ? $_SERVER[`HTTP_HOST`] : ``); }
參考文章:
http://www.cnblogs.com/skiplow/archive/2011/07/20/2111751.html (偽造IP地址進行SYN洪水攻擊)
http://www.feifeiboke.com/pcjishu/3391.html (你所不懂的火狐瀏覽器妙用之偽造IP地址)
https://segmentfault.com/q/1010000000095850#a-1020000000098537 (如何避免使用者訪問請求偽造ip)
http://blog.csdn.net/clh604/article/details/9234473 (PHP使用curl偽造IP地址和header資訊)
http://www.cnblogs.com/lmule/archive/2010/10/15/1852020.html (REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR)
版權宣告:本文采用署名-非商業性使用-相同方式共享(CC BY-NC-SA 3.0 CN)國際許可協議進行許可,轉載請註明作者及出處。 |
相關文章
- saltstack獲取IP地址
- java 偽造http請求ip地址JavaHTTP
- java獲取本機的ip地址Java
- js根據ip地址獲取省份城市的方法JS
- jQuery獲取本機ip地址jQuery
- 如何獲取海外住宅IP地址?
- 美國ip地址如何獲取?
- 獲取IP地址的途徑有哪些?要如何保護IP地址不被竊取?
- 如何使用 Go 獲取你的 IP 地址Go
- 網路攻擊中常見掩蓋真實IP的攻擊方式及虛假IP地址追蹤溯源方法
- 什麼是自動獲取IP地址
- 如何設定自動獲取ip地址
- w10如何設定自動獲取ip地址_w10怎麼自動獲取ip地址
- 電腦ip地址在哪 電腦ip地址查詢方法
- 【TCP/IP】IP地址分類和特殊IP地址TCP
- 【Go】獲取使用者真實的ip地址Go
- 【Go】獲取使用者真實的 ip 地址Go
- js根據IP地址獲取當前的省市JS
- Oracle中獲取主機名和IP地址Oracle
- IP地址
- MAC 地址與IP地址Mac
- Kali Linux常用服務配置教程獲取IP地址Linux
- 【SQL】SQL解惑-如何從字串中獲取IP地址SQL字串
- ip代理地址免費獲取怎麼做?
- reactnative獲取裝置真實ip地址和ip對映的地理位置React
- 如何偽裝自己的IP地址?兔子軟體IP代理輕鬆搞定
- win10 ip地址怎麼設定_win10修改ip地址的方法Win10
- 使用代理IP輕鬆獲得韓國IP地址
- Python獲取IP地址對應的地理位置資訊!Python
- Python 基礎練習 —— 獲取本機 Mac 地址、ip 地址和主機名PythonMac
- IP地址和MAC地址的關係Mac
- js根據ip地址獲取城市地理位置JS
- 在OwinSelfHost專案中獲取客戶端IP地址客戶端
- 在SelfHost專案中獲取客戶端IP地址客戶端
- 國外免費代理ip地址密碼如何獲取?密碼
- 隱藏IP地址的三種方法
- 改變IP地址的三種方法
- 檢視ip地址的cmd命令 cmd查詢ip地址命令