IP地址API

IP地址API

by 尘缘 on 十一月 29th, 2010 // Filed Under → php

当我们开发了一些应用以后,可能需要限制用户程序进行分发,典型的例子就是绑定域名的App。如果用户将域名使用本地HOST解析,很有可能绕过程序的域名限制,从而绑定其它域名进行产品分发。

使用本地和服务器端IP同步验证,则可以很好的解决这个问题。

如果,使用gethostbyname取得一个域名的IP,同时再去访问一下其它外网,取得程序所在外网IP,如果两个IP不一样,则可以判断出程序的合法性。

从一些大网站取得IP是比较可行的办法。

腾讯的IP地址API接口地址:http://fw.qq.com/ipaddress
返回的是数据格式为:var IPData = new Array(“114.218.183.139″,”",”北京市”);
使用JS代码进行调取:

1
2
3
<script language= "javascript" type= "text/javascript" src= "http://fw.qq.com/ipaddress" ></script>
  
<script>document.write( "你的IP是:" +IPData[0]+ ",来自:" +IPData[2]);</script>

上面的API和下面的API都可以用JS进行调用,如果想用PHP等服务器端脚本获取,可以使用正则选取的方法,但比较多余,下面的讲一下PHP直接获取客户端IP的办法。

PHP获取IP地址的方法:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function getIpAdress(){
  //this code is from phpwind
  if ( $_SERVER [ 'HTTP_X_FORWARDED_FOR' ]){
      $onlineip = $_SERVER [ 'HTTP_X_FORWARDED_FOR' ];
  } elseif ( $_SERVER [ 'HTTP_CLIENT_IP' ]){
      $onlineip = $_SERVER [ 'HTTP_CLIENT_IP' ];
  } else {
   $onlineip = $_SERVER [ 'REMOTE_ADDR' ];
  }
  return $onlineip ;
}
 
function getMyIpAdress(){
  //thin code is from discuz
  if ( getenv ( 'HTTP_CLIENT_IP' ) && strcasecmp ( getenv ( 'HTTP_CLIENT_IP' ), 'unknown' )) {
   $onlineip = getenv ( 'HTTP_CLIENT_IP' );
  } elseif ( getenv ( 'HTTP_X_FORWARDED_FOR' ) && strcasecmp ( getenv ( 'HTTP_X_FORWARDED_FOR' ), 'unknown' )) {
   $onlineip = getenv ( 'HTTP_X_FORWARDED_FOR' );
  } elseif ( getenv ( 'REMOTE_ADDR' ) && strcasecmp ( getenv ( 'REMOTE_ADDR' ), 'unknown' )) {
   $onlineip = getenv ( 'REMOTE_ADDR' );
  } elseif (isset( $_SERVER [ 'REMOTE_ADDR' ]) && $_SERVER [ 'REMOTE_ADDR' ] && strcasecmp ( $_SERVER [ 'REMOTE_ADDR' ], 'unknown' )) {
   $onlineip = $_SERVER [ 'REMOTE_ADDR' ];
  }
  return $onlineip ;
}

上述代码中,需要做下解释的是以下三中获取IP地址的方法:

$_SERVER['HTTP_CLIENT_IP']:代理端的IP(有可能存在,可伪造)

$_SERVER['HTTP_X_FORWARDED_FOR']:使用代理前的原始IP,有可能存在,可伪造。如果客户端没有通过代理服务器来访问,那么用$_SERVER["HTTP_X_FORWARDED_FOR"] 取到的值将是空的。

$_SERVER['REMOTE_ADDR']:是你的客户端跟服务器“握手”时候的IP。如果使用了“匿名代理”,REMOTE_ADDR将显示代理服务器的IP。不可被修改。

由于$_SERVER['HTTP_X_FORWARDED_FOR']和$_SERVER['REMOTE_ADDR']都是存在HTTP的Header中,是可以用来伪造。

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function getIpPlace(){
  //use file_get_contents()
  $cookie = $_GET [ 'cookie' ];
  $HttpReferrer = $_SERVER [ 'HTTP_REFERER' ];
  $HttpClientIP = $_SERVER [ 'HTTP_CLIENT_IP' ];
  $RemAddr = $_SERVER [ 'REMOTE_ADDR' ];
  $XForward = $_SERVER [ 'HTTP_X_FORWARDED_FOR' ];
  $opts = array (
  'http' => array (
   'user-agent' => $_SERVER [ 'HTTP_USER_AGENT' ],
   'method' => "GET" ,
   'header' => "Content-type: application/x-www-form-urlencoded\r\n" .
    "Referer:" . $HttpReferrer . "\r\n" .
    "Cookie:" . $cookie . "\r\n" .
    "X_FORWARDED_FOR:" . $XForward . "\r\n" .
    "CLIENT_IP:" . $HttpClientIP . "\r\n" .
    "\r\n" ,
   )
  );
  $cxContext = stream_context_create( $opts );
  $ip = file_get_contents ( "http://fw.qq.com/ipaddress" ,false, $cxContext );
  $ip = str_replace ( '"' , ' ' , $ip );
  $ip2 = explode ( "(" , $ip );
  $a = substr ( $ip2 [1],0,-2);
  $b = explode ( "," , $a );
  return $b ;
}

可以看到上面返回的还是服务器的IP地址,所以腾讯的IP地址查询的是$_SERVER['REMOTE_ADDR'],目前还没有办法对其修改,在需要的情况下,获取的数据是非常真实的。

另:

新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js

新浪多地域测试方法:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=218.192.3.42

搜狐IP地址查询接口(默认GBK):http://pv.sohu.com/cityjson

搜狐IP地址查询接口(可设置编码):http://pv.sohu.com/cityjson?ie=utf-8

搜狐另外的IP地址查询接口:http://txt.go.sohu.com/ip/soip

淘宝:http://ip.taobao.com/service/getIpInfo.php?ip=8.8.8.8

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值