灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3778回复:0

PHP获得客户端IP

楼主#
更多 发布于:2012-09-12 06:49


1 <?php  
2   // Example use of getenv()
3   $ip = getenv('REMOTE_ADDR');
4   // Or simply use a Superglobal ($_SERVER or $_ENV)
5   $ip = $_SERVER['REMOTE_ADDR'];  
6 ?>

这是在php官方的manual提供的方法。
但是当web服务器API是ASAPI (IIS)的时候,getenv函数是不起作用的。这种情况下你如果用getenv来取得用户客户端ip的话,得到的将是错误的ip地址。
因此更为安全和准确的方法是尽量避免使用getenv函数。比如可以用以下的函数来获取ip信息:

01 <?php
02     function GetIP(){
03         if (getenv("HTTP_CLIENT_IP")  
04             ;; strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
05            $ip = getenv("HTTP_CLIENT_IP");
06         else if (getenv("HTTP_X_FORWARDED_FOR")  
07             ;; strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
08            $ip = getenv("HTTP_X_FORWARDED_FOR");
09         else if (getenv("REMOTE_ADDR")  
10             ;; strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
11            $ip = getenv("REMOTE_ADDR");
12         else if (isset($_SERVER['REMOTE_ADDR'])  
13             ;; $_SERVER['REMOTE_ADDR']  
14             ;; strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
15            $ip = $_SERVER['REMOTE_ADDR'];
16         else
17            $ip = "unknown";
18         return($ip);
19     }
20  
21     $ip = GetIP();
22     echo $ip;
23 ?>

其中 HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR 的区别是

一、没有使用代理服务器的情况:
      REMOTE_ADDR = 您的 IP
HTTP_VIA = 没数值或不显示www.ATCPU.COM
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。
   完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。

function getip(){
if($_SERVER['HTTP_X_FORWARDED_FOR']){
$online_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}elseif($_SERVER['HTTP_CLIENT_IP']){
$online_ip = $_SERVER['HTTP_CLIENT_IP'];
}else{
$online_ip = $_SERVER['REMOTE_ADDR'];
}
return $online_ip;
}


喜欢0 评分0
游客

返回顶部