获取用户真实ip地址的方法
五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)
例子2
REMOTE_ADDR = 代理服务器 IP
REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 代理服务器 IP
,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163,
203.129.72.215。
HTTP_X_FORWARDED_FOR = 您的真实 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
$ip = $_SERVER['REMOTE_ADDR']; //PHP获取IP
REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 您的真实 IP
,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163,
203.129.72.215。
一、没有使用代理服务器的情况:
五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)
代码如下
实例
/*
告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。
}
HTTP_X_FORWARDED_FOR = 代理服务器 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示
,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163,
203.129.72.215。
告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。
三、使用普通匿名代理服务器的情况:Anonymous Proxies
$ip = $_SERVER['HTTP_CLIENT_IP']; //PHP获取IP
/**
* 获得用户的真实IP地址
*
* @access public
* @return string
*/
function real_ip()
{
// 初始化一个变量$realip
static $realip = NULL;
// 如果$realip不真等于NULL,返回之
if ($realip !== NULL)
{
return $realip;
}
// 如果$_SERVER有值
if (isset($_SERVER))
{
// 如果$_SERVER['HTTP_X_FORWARDED_FOR']有值
// 表明客户端通过代理上网
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
{
// 使用explode()函数将其用','分割成数组
$arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
/* 取X-Forwarded-For中第一个非unknown的有效IP字符串 */
// 开始遍历数组
foreach ($arr AS $ip)
{
// 去掉首尾的空白
$ip = trim($ip);
// 不是unknown就是真实上网地址,存值并退出循环
if ($ip != 'unknown')
{
$realip = $ip;
break;
}
}
}
// $_SERVER['HTTP_X_FORWARDED_FOR']无值 且
// $_SERVER['HTTP_CLIENT_IP']有值,取其值作为真实IP
elseif (isset($_SERVER['HTTP_CLIENT_IP']))
{
$realip = $_SERVER['HTTP_CLIENT_IP'];
}
// $_SERVER['HTTP_X_FORWARDED_FOR']无值(不是用过代理上网)并且
// $_SERVER['HTTP_CLIENT_IP']也没有值
else
{
// 如果$_SERVER['REMOTE_ADDR']有值,取其值作为真实IP
if (isset($_SERVER['REMOTE_ADDR']))
{
$realip = $_SERVER['REMOTE_ADDR'];
}
else // 都没有值返回'0.0.0.0'
{
$realip = '0.0.0.0';
}
}
}
// $_SERVER没有值
else
{
// 如果getenv('HTTP_X_FORWARDED_FOR')非空取其值作为真实IP
if (getenv('HTTP_X_FORWARDED_FOR'))
{
$realip = getenv('HTTP_X_FORWARDED_FOR');
}
// 如果getenv('HTTP_CLIENT_IP')非空取其值作为真实IP
elseif (getenv('HTTP_CLIENT_IP'))
{
$realip = getenv('HTTP_CLIENT_IP');
}
// 否则取getenv('REMOTE_ADDR')的值作为真实IP
else
{
$realip = getenv('REMOTE_ADDR');
}
}
preg_match("/[d.]{7,15}/", $realip, $onlineip); // 此句干嘛用的?请高人指教一下。
$realip = !empty($onlineip[0]) ? $onlineip[0] : '0.0.0.0'; // 此句又是干嘛用的?请指教。
return $realip;
}
代码如下
告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。
例子1(获取用户真实IP地址)
REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 代理服务器 IP
,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163,
203.129.72.215。
REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 您的真实 IP
,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163,
203.129.72.215。
HTTP_VIA = 代理服务器 IP
四、使用欺骗性代理服务器的情况:Distorting Proxies
针对以上的属性分析将代码改为:
if($_SERVER['HTTP_CLIENT_IP']) {
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示
,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163,
203.129.72.215。
}
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 随机的 IP
,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163,
203.129.72.215。
} else {
这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。
*/
//获取用户真实IP
function get_client_ip() {
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"),
"unknown"))
$ip = getenv("HTTP_CLIENT_IP");
else
if (getenv("HTTP_X_FORWARDED_FOR") &&
strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else
if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"),
"unknown"))
$ip = getenv("REMOTE_ADDR");
else
if (isset ($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR']
&& strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
$ip = $_SERVER['REMOTE_ADDR'];
else
$ip = "unknown";
return ($ip);
}
echo $ip=get_client_ip();//这就是你的ip地址
?>
这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。
/// <summary>
/// 获取客户端Ip
/// </summary>
/// <returns></returns>
public string GetUserIP()
{
string _userIP;
try
{
if (HttpContext.Current.Request.ServerVariables["HTTP_VIA"] == null)
{
_userIP = HttpContext.Current.Request.UserHostAddress;
}
else
{
_userIP = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
}
catch (Exception)
{
_userIP = "无法获取此IP";
}
return _userIP;
}
五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)
四、使用欺骗性代理服务器的情况:Distorting Proxies
function getIp() {
REMOTE_ADDR = 最后一个代理服务器 IP
隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。
最近在获取浏览客户端IP的功能的时候出现一个问题,主要的现象是这样的:一个在武汉使用北京电信的客户端的IP始终不能被我的程序访问,查了些资料修改了下,主要是对于c#获取IP的三种属性(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)的区分分析如下:
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。
本文由宝马娱乐在线城发布于互联网络,转载请注明出处:获取用户真实ip地址的方法
关键词: