当前位置:首页 > PHP教程 > php高级应用 > 列表

$_SERVER参数HTTP_X_FORWARDED_FOR & REMOTE_ADDR与获取IP

发布:smiling 来源: PHP粉丝网  添加日期:2014-08-28 14:18:31 浏览: 评论:0 

1.REMOTE_ADDR:浏览当前页面的用户计算机的ip地址 2.HTTP_X_FORWARDED_FOR:浏览当前页面的用户计算机的网关 3.HTTP_CLIENT_IP:客户端的ip 

在PHP 中使用 $_SERVER["REMOTE_ADDR"] 来取得客户端的 IP 地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址,就要使用 $_SERVER["HTTP_X_FORWARDED_FOR"] 来读取.

不过要注意的事,并不是每个代理服务器都能用 $_SERVER["HTTP_X_FORWARDED_FOR"] 来读取客户端的真实 IP,有些用此方法读取到的仍然是代理服务器的 IP.

还有一点需要注意的是:如果客户端没有通过代理服务器来访问,那么用$_SERVER["HTTP_X_FORWARDED_FOR"] 取到的值将是空的,因此,如果要在程序中使用此方法,可以这样处理,代码如下:

  1. <?php 
  2. if ($_SERVER["HTTP_X_FORWARDED_FOR"]==”") 
  3.  
  4.  
  5. $user_ip=$_SERVER["REMOTE_ADDR"]; 
  6.  
  7.  
  8. else 
  9.  
  10. $user_ip=$_SERVER["HTTP_X_FORWARDED_FOR"]; 
  11. //开源代码phpfensi.com 
  12. ?> 

即:如果客户端通过代理服务器,则取 HTTP_X_FORWARDED_FOR 的值,如果没通过代理服务器,就取 REMOTE_ADDR 的值.

获得客户端真实的IP地址,代码如下:

  1. function GetIP(){ 
  2.  
  3. if (getenv(“HTTP_CLIENT_IP”) && strcasecmp(getenv(“HTTP_CLIENT_IP”), “unknown”)) 
  4.  
  5. $ip = getenv(“HTTP_CLIENT_IP”); 
  6.  
  7. else if (getenv(“HTTP_X_FORWARDED_FOR”) && strcasecmp(getenv(“HTTP_X_FORWARDED_FOR”), “unknown”)) 
  8.  
  9. $ip = getenv(“HTTP_X_FORWARDED_FOR”); 
  10.  
  11. else if (getenv(“REMOTE_ADDR”) && strcasecmp(getenv(“REMOTE_ADDR”), “unknown”)) 
  12.  
  13. $ip = getenv(“REMOTE_ADDR”); 
  14.  
  15. else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], “unknown”)) 
  16.  
  17. $ip = $_SERVER['REMOTE_ADDR']; 
  18.  
  19. else 
  20.  
  21. $ip = “unknown”; 
  22.  
  23. return($ip); 
  24.  

获取用户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.

这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的.

三、使用普通匿名代理服务器的情况: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.

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

  1. <?php  
  2. if ($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"])  
  3. {  
  4. $ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];  
  5. }  
  6. elseif ($HTTP_SERVER_VARS["HTTP_CLIENT_IP"])  
  7. {  
  8. $ip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"];  
  9. }  
  10. elseif ($HTTP_SERVER_VARS["REMOTE_ADDR"])  
  11. {  
  12. $ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];  
  13. }  
  14. elseif (getenv("HTTP_X_FORWARDED_FOR"))  
  15. {  
  16. $ip = getenv("HTTP_X_FORWARDED_FOR");  
  17. }  
  18. elseif (getenv("HTTP_CLIENT_IP"))  
  19. {  
  20. $ip = getenv("HTTP_CLIENT_IP");  
  21. }  
  22. elseif (getenv("REMOTE_ADDR"))  
  23. {  
  24. $ip = getenv("REMOTE_ADDR");  
  25. }  
  26. else  
  27. {  
  28. $ip = "Unknown";  
  29. }  
  30. echo "你的IP:".$ip ;  
  31. ?> 

Tags: $_SERVER参数 HTTP_X_FORWARDED_FOR

分享到: