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