PHP得到客户端IP

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

这是在PHP官方的manual提供的方法。php

可是当Web服务器API是ASAPI (IIS)的时候,getenv函数是不起做用的。这种状况下你若是用getenv来取得用户客户端ip的话,获得的将是错误的ip地址。安全

所以更为安全和准确的方法是尽可能避免使用getenv函数。好比能够用如下的函数来获取ip信息:服务器

<?php
	function GetIP(){
   		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);
	}

	$ip = GetIP();
	echo $ip;
?>

其中 HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR 的区别是 函数

1、没有使用代理服务器的状况:spa

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

2、使用透明代理服务器的状况:Transparent Proxiescode

      REMOTE_ADDR = 最后一个代理服务器 IP 
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 您的真实 IP ,通过多个代理服务器时,这个值相似以下:203.98.182.163, 203.98.182.163, 203.129.72.215。对象

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

3、使用普通匿名代理服务器的状况:Anonymous Proxiesget

      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。

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

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; }

相关文章
相关标签/搜索