PHP获取IP地址的方法,防止伪造IP地址注入攻击
PHP獲取IP地址的方法
/*** 獲取客戶端IP地址* <br />來源:ThinkPHP* <br />"X-FORWARDED-FOR" 是代理服務(wù)器通過 HTTP Headers 提供的客戶端IP。代理服務(wù)器可以偽造任何IP。* <br />要防止偽造,不要讀這個(gè)IP即可(同時(shí)告訴用戶不要用HTTP 代理)。* @param integer $type 返回類型 0 返回IP地址 1 返回IPV4地址數(shù)字* @param boolean $adv 是否進(jìn)行高級模式獲取(有可能被偽裝) * @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地址合法驗(yàn)證, 防止通過IP注入攻擊$long = sprintf("%u", ip2long($ip));$ip = $long ? array($ip, $long) : array('0.0.0.0', 0);return $ip[$type]; }/*** 獲得用戶的真實(shí)IP地址* <br />來源:ecshop* <br />$_SERVER和getenv的區(qū)別,getenv不支持IIS的isapi方式運(yùn)行的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中第一個(gè)非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');}}// 使用正則驗(yàn)證IP地址的有效性,防止偽造IP地址進(jìn)行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地址進(jìn)行注入攻擊:
IP偽造有幾種途徑,一種是通過是修改IP數(shù)據(jù)包,有興趣的可以去看看IP數(shù)據(jù)包的結(jié)構(gòu),還有一種就是利用修改http頭信息來實(shí)現(xiàn)IP偽造。涉及到“客戶端”IP的通常使用3個(gè)環(huán)境變量:$_SERVER['HTTP_CLIENT_IP']和$_SERVER['X_FORWARDED_FOR']還有$_SERVER['REMOTE_ADDR']實(shí)際上,這3個(gè)環(huán)境變量都有局限性。前兩個(gè)是可以隨意偽造。只要在發(fā)送的http頭里設(shè)置相應(yīng)值就可以,任意字符都可以,而第3個(gè)環(huán)境變量,如果用戶使用了匿名代理,那這個(gè)變量顯示的就是代理IP。
一般獲取IP后更新到數(shù)據(jù)庫代碼如:$sql="update t_users set login_ip='".get_client_ip()."' where ...",而如果接收到的ip地址是:xxx.xxx.xxx.xxx';delete from t_users;-- ,代入?yún)?shù)SQL語句就變成了:"update t_users set login_ip='xxx.xxx.xxx.xxx';delete from t_users;-- where ...
所以獲取IP地址后,務(wù)必使用正則等對IP地址的有效性進(jìn)行驗(yàn)證,另外一定要使用參數(shù)化SQL命令!
總結(jié):
"X-FORWARDED-FOR" 是代理服務(wù)器通過 HTTP Headers 提供的客戶端IP。代理服務(wù)器可以偽造任何IP。
要防止偽造,不要讀這個(gè)IP即可(同時(shí)告訴用戶不要用HTTP 代理)。
如果是PHP,$_SERVER['REMOTE_ADDR'] 就是跟你服務(wù)器直接連接的IP,用這個(gè)就可以了。
?
獲取服務(wù)器IP地址:
/*** 獲取服務(wù)端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地址進(jìn)行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)
?
| 版權(quán)聲明:本文采用署名-非商業(yè)性使用-相同方式共享(CC BY-NC-SA 3.0 CN)國際許可協(xié)議進(jìn)行許可,轉(zhuǎn)載請注明作者及出處。 |
轉(zhuǎn)載于:https://www.cnblogs.com/lonelyxmas/p/9682236.html
總結(jié)
以上是生活随笔為你收集整理的PHP获取IP地址的方法,防止伪造IP地址注入攻击的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SmartSVN:File has in
- 下一篇: arcgis地理配准如何取消自动校正