获取用户IP地址的三个属性的区别及CakePHP之获取IP方法

本文详细介绍了在不同类型的代理服务器下获取客户端真实IP地址的方法,包括透明代理、匿名代理、欺骗性代理及高匿名代理等,并提供了PHP及CakePHP中的具体实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想要获取ip并不难,但是要获取准确的ip的确是值得探索的问题.
在使用代理,透明代理,匿名代理以及欺骗性代理服务器等等情况下,在获取客户端IP的时候,需要做相应的判断:

一、无代理服务器:

REMOTE_ADDR = 您的 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示

二、使用透明代理服务器:Transparent Proxies
透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改编你的request fields(报文),并会传送真实IP.例如Garden 2程序.

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
使用此种代理时,可以知道你在使用代理,有些侦测IP的网页也仍然可以查到你的IP:

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)
使用此种代理时,被访问的网站不知道你的IP地址,也不知道你在使用代理进行访问.此种代理的隐藏IP地址的功能最强.

REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示 ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。

[b]在PHP中获取IP的方法有:[/b]
1.简单的

$ip = ($_SERVER["HTTP_VIA"])?$_SERVER["HTTP_X_FORWARDED_FOR"]:$_SERVER["REMOTE_ADDR"];
$ip = $ip?$ip:$_SERVER["REMOTE_ADDR"];


2.复杂点的
//php获取ip的算法
if ($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]){

$ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];

}elseif ($HTTP_SERVER_VARS["HTTP_CLIENT_IP"]){

$ip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"];

}elseif ($HTTP_SERVER_VARS["REMOTE_ADDR"]){

$ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];

}elseif (getenv("HTTP_X_FORWARDED_FOR")){

$ip = getenv("HTTP_X_FORWARDED_FOR");

}elseif (getenv("HTTP_CLIENT_IP")){

$ip = getenv("HTTP_CLIENT_IP");

}elseif (getenv("REMOTE_ADDR")){

$ip = getenv("REMOTE_ADDR");

}else{

$ip = "Unknown";

}


[b]在CakePHP中[/b],如果加载了RequestHandler组件,则其中的getClientIP方法可以用来获取客户端IP:

$this->RequestHandler->getClientIP();


RequestHandler中源码:

	function getClientIP($safe = true) {
if (!$safe && env('HTTP_X_FORWARDED_FOR') != null) {
$ipaddr = preg_replace('/(?:,.*)/', '', env('HTTP_X_FORWARDED_FOR'));
} else {
if (env('HTTP_CLIENT_IP') != null) {
$ipaddr = env('HTTP_CLIENT_IP');
} else {
$ipaddr = env('REMOTE_ADDR');
}
}

if (env('HTTP_CLIENTADDRESS') != null) {
$tmpipaddr = env('HTTP_CLIENTADDRESS');

if (!empty($tmpipaddr)) {
$ipaddr = preg_replace('/(?:,.*)/', '', $tmpipaddr);
}
}
return trim($ipaddr);
}


非常简单.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值