IP地址API

来源:互联网 发布:华三交换机端口状态 编辑:程序博客网 时间:2024/05/17 01:00

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
functiongetIpAdress(){
 //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;
}
 
functiongetMyIpAdress(){
 //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
functiongetIpPlace(){
 //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
原创粉丝点击