IP地址API

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

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

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

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

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

[js]
<script language="javascript" type="text/javascript" src="http://fw.qq.com/ipaddress"></script>

<script>document.write("你的IP是:"+IPData[0]+",来自:"+IPData[2]);</script>
[/js]

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

PHP获取IP地址的方法:

[php]
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;
}
[/php]

上述代码中,需要做下解释的是以下三中获取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中,是可以用来伪造。

[php]
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;
}
[/php]

可以看到上面返回的还是服务器的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