在PHP猎取客户端IP时,常运用 $_SERVER["REMOTE_ADDR"] 。但假如客户端是运用代办服务器来接见,那取到的是代办服务器的 IP 地点,而不是真正的客户端 IP 地点。要想透过代办服务器取得客户端的实在 IP 地点,就要运用$_SERVER["HTTP_X_FORWARDED_FOR"]来读取。
但只要客户端运用“通明代办”的状况下,$_SERVER["HTTP_X_FORWARDED_FOR"] 的值才是客户端真正的IP(假如是多层代办,该值多是由客户端真正IP和多个代办服务器的IP构成,由逗号“,”分开);而在“匿名代办”、“诳骗性代办”的状况下是代办服务器的IP值(假如是多层代办,该值能够由多个代办服务器的IP构成,由逗号“,”分开);在“高匿名代办”的状况下是空值。
REMOTE_ADDR 是你的客户端跟你的服务器“握手”时刻的IP。假如运用了“匿名代办”,REMOTE_ADDR将显现代办服务器的IP。
HTTP_CLIENT_IP 是代办服务器发送的HTTP头。假如是“超等匿名代办”,则返回none值。一样,REMOTE_ADDR也会被替换为这个代办服务器的IP。
$_SERVER['REMOTE_ADDR']; //接见端IP(有多是用户,有多是代办服务器的,也有多是反向代办服务器的)
$_SERVER['HTTP_CLIENT_IP']; //代办端的(有能够存在,可捏造),未成规范,不一定服务器都完成了。
$_SERVER['HTTP_X_FORWARDED_FOR']; //用户是在哪一个IP运用的代办(有能够存在,也能够捏造),有规范定义,用来辨认经由HTTP代办后的客户端IP地点,花样:clientip,proxy1,proxy2。细致诠释见 http://zh.wikipedia.org/wiki/X-Forwarded-For。
三个值区分以下:
一、没有运用代办服务器的状况:
REMOTE_ADDR = 您的 IP
HTTP_VIA = 没数值或不显现
HTTP_X_FORWARDED_FOR = 没数值或不显现
二、运用通明代办服务器的状况:Transparent Proxies
REMOTE_ADDR = 末了一个代办服务器 IP
HTTP_VIA = 代办服务器 IP
HTTP_X_FORWARDED_FOR = 您的实在 IP ,经由多个代办服务器时,这个值相似以下:203.98.182.163, 203.98.182.163, 203.129.72.215。
这类代办服务器照样将您的信息转发给您的接见对象,没法到达隐蔽实在身份的目标。
三、运用一般匿名代办服务器的状况:Anonymous Proxies
REMOTE_ADDR = 末了一个代办服务器 IP
HTTP_VIA = 代办服务器 IP
HTTP_X_FORWARDED_FOR = 代办服务器 IP ,经由多个代办服务器时,这个值相似以下:203.98.182.163, 203.98.182.163, 203.129.72.215。
隐蔽了您的实在IP,然则向接见对象透露了您是运用代办服务器接见他们的。
四、运用诳骗性代办服务器的状况:Distorting Proxies
REMOTE_ADDR = 代办服务器 IP
HTTP_VIA = 代办服务器 IP
HTTP_X_FORWARDED_FOR = 随机的 IP ,经由多个代办服务器时,这个值相似以下:203.98.182.163, 203.98.182.163, 203.129.72.215。
通知了接见对象您运用了代办服务器,但假造了一个子虚的随机IP代替您的实在IP诳骗它。
五、运用高匿名代办服务器的状况:High Anonymity Proxies (Elite proxies)
REMOTE_ADDR = 代办服务器 IP
HTTP_VIA = 没数值或不显现
HTTP_X_FORWARDED_FOR = 没数值或不显现 ,经由多个代办服务器时,这个值相似以下:203.98.182.163, 203.98.182.163, 203.129.72.215。
完整用代办服务器的信息替换了您的一切信息,就象您就是完整运用那台代办服务器直接接见对象。
示例代码:
//猎取用户IP, 定义一个函数getIP() function getClientIP(){ if (getenv("HTTP_CLIENT_IP")) { $ip = getenv("HTTP_CLIENT_IP"); }elseif(getenv("HTTP_X_FORWARDED_FOR")) { $ip = getenv("HTTP_X_FORWARDED_FOR"); }elseif(getenv("REMOTE_ADDR")) { $ip = getenv("REMOTE_ADDR"); else $ip = "Unknow"; } return $ip; } 或许 function getClientIp() { $ip = 'unknow'; foreach (array( 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) { if (array_key_exists($key, $_SERVER)) { foreach (explode(',', $_SERVER[$key]) as $ip) { $ip = trim($ip); //会过滤掉保存地点和私有地点段的IP,比方 127.0.0.1会被过滤 //也能够修改成正则考证IP if ((bool) filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { return $ip; } } } } return $ip; }
2.php猎取服务器端IP
服务器端IP相干的变量
a. $_SERVER["SERVER_NAME"],须要运用函数gethostbyname()取得。这个变量不管在服务器端照样客户端均能准确显现。
b. $_SERVER["SERVER_ADDR"],在服务器端测试:127.0.0.1(这个与httpd.conf中BindAddress的设置值相干)。在客户端测试效果准确。
/** * 猎取服务器端IP地点 * @return string */ function getServerIp() { if (isset($_SERVER)) { if($_SERVER['SERVER_ADDR']) { $server_ip = $_SERVER['SERVER_ADDR']; } else { $server_ip = $_SERVER['LOCAL_ADDR']; } } else { $server_ip = getenv('SERVER_ADDR'); } return $server_ip; } 或许 function getServerIP(){ return gethostbyname($_SERVER["SERVER_NAME"]); }
更多相干题目请接见ki4网相干题目教程:https://www.ki4.cn/
以上就是运用PHP来猎取客户端和服务端IP的细致内容,更多请关注ki4网别的相干文章!