正在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。
三个值区分以下:
1、不应用代办署理效劳器的状况:
REMOTE_ADDR = 您的 IP
HTTP_VIA = 没数值或没有显示
HTTP_X_FORWARDED_FOR = 没数值或没有显示
2、应用通明代办署理效劳器的状况: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。
这种代办署理效劳器仍是将您的信息转发给您的拜访工具,无奈达到暗藏实在身份的目的。
3、应用一般匿名代办署理效劳器的状况: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,然而向拜访工具走漏了您是应用代办署理效劳器拜访他们的。
4、应用诈骗性代办署理效劳器的状况: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诈骗它。
5、应用高匿名代办署理效劳器的状况: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"]); }
更多相干成绩请拜访PHP中文网相干成绩教程:https://www.php.cn/
以上就是应用PHP来猎取客户端以及效劳端IP的具体内容,更多请存眷资源魔其它相干文章!
标签: php php开发教程 php开发资料 php开发自学
抱歉,评论功能暂时关闭!