php获取客户端IP和php获取服务器端IP

  1. 1.php获取客户端IP

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

    但只有客户端使用透明代理的情况下,$_SERVER["HTTP_X_FORWARDED_FOR"] 的值才是客户端真正的IP(如果是多层代理,该值可能是由客户端真正IP和多个代理服务器的IP组成,由逗号“,”分隔);而在匿名代理欺骗性代理的情况下是代理服务器的IP值(如果是多层代理,该值可能由多个代理服务器的IP组成,由逗号“,”分隔);在高匿名代理的情况下是空值。

    REMOTE_ADDR 是你的客户端跟你的服务器握手时候的IP。如果使用了匿名代理REMOTE_ADDR将显示代理服务器的IP 
    HTTP_CLIENT_IP 
    是代理服务器发送的HTTP头。如果是超级匿名代理,则返回none值。同样,REMOTE_ADDR也会被替换为这个代理服务器的IP

    $_SERVER['REMOTE_ADDR']; //访问端IP(有可能是用户,有可能是代理服务器的,也有可能是反向代理服务器的)
    $_SERVER['HTTP_CLIENT_IP']; //
    代理端的(有可能存在,可伪造),未成标准,不一定服务器都实现了。
    $_SERVER['HTTP_X_FORWARDED_FOR']; //
    用户是在哪个IP使用的代理(有可能存在,也可以伪造),有标准定义,用来识别经过HTTP代理后的客户端IP地址,格式:clientip,proxy1,proxy2。详细解释见 http://zh.wikipedia.org/wiki/X-Forwarded-For

    三个值区别如下:

    一、没有使用代理服务器的情况:

    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。

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

    示例代码:

    [php]  view plain  copy
    1. //获取用户IP, 定义一个函数getIP()  
    2. function getClientIP(){  
    3. if (getenv("HTTP_CLIENT_IP")) {  
    4.     $ip = getenv("HTTP_CLIENT_IP");  
    5. }elseif(getenv("HTTP_X_FORWARDED_FOR")) {  
    6.     $ip = getenv("HTTP_X_FORWARDED_FOR");  
    7. }elseif(getenv("REMOTE_ADDR")) {  
    8. $ip = getenv("REMOTE_ADDR");  
    9.     else $ip = "Unknow";  
    10. }  
    11. return $ip;  
    12. }  
    13. 或者  
    14. function getClientIp() {  
    15.     $ip = 'unknow';  
    16.     foreach (array(  
    17.                 'HTTP_CLIENT_IP',  
    18.                 'HTTP_X_FORWARDED_FOR',  
    19.                 'HTTP_X_FORWARDED',  
    20.                 'HTTP_X_CLUSTER_CLIENT_IP',  
    21.                 'HTTP_FORWARDED_FOR',  
    22.                 'HTTP_FORWARDED',  
    23.                 'REMOTE_ADDR'as $key) {  
    24.         if (array_key_exists($key$_SERVER)) {  
    25.             foreach (explode(','$_SERVER[$key]) as $ip) {  
    26.                 $ip = trim($ip);  
    27.                 //会过滤掉保留地址和私有地址段的IP,例如 127.0.0.1会被过滤  
    28.                 //也可以修改成正则验证IP  
    29.                 if ((bool) filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {  
    30.                     return $ip;  
    31.                 }  
    32.             }  
    33.         }  
    34.     }  
    35.     return $ip;  
    36. }  

    2.php获取服务器端IP

    服务器端IP相关的变量
    a. $_SERVER["SERVER_NAME"],需要使用函数gethostbyname()获得。这个变量无论在服务器端还是客户端均能正确显示。

    b. $_SERVER["SERVER_ADDR"],在服务器端测试:127.0.0.1(这个与httpd.conf中BindAddress的设置值相关)。在客户端测试结果正确。

    [php]  view plain  copy
    1. /** 
    2. * 获取服务器端IP地址 
    3.  * @return string 
    4.  */  
    5. function getServerIp() {   
    6.     if (isset($_SERVER)) {   
    7.         if($_SERVER['SERVER_ADDR']) {  
    8.             $server_ip = $_SERVER['SERVER_ADDR'];   
    9.         } else {   
    10.             $server_ip = $_SERVER['LOCAL_ADDR'];   
    11.         }   
    12.     } else {   
    13.         $server_ip = getenv('SERVER_ADDR');  
    14.     }   
    15.     return $server_ip;   
    16. }  
    17. 或者  
    18. function getServerIP(){      
    19.     return gethostbyname($_SERVER["SERVER_NAME"]);      
    20. }   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值