【发布时间】:2012-04-06 01:24:42
【问题描述】:
我正在尝试从 IP 地址获取国家/地区。 问题是某些计算机上没有显示用户 IP。一些测试它的用户获得 IP,但其他用户没有(在同一个 WiFi 网络上)。
这是我的代码。怎么了?
function VisitorIP()
{
if (!empty($_SERVER['HTTP_CLIENT_IP'])) //check ip from share internet
{
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) //to check ip is pass from proxy
{
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
$ip=$_SERVER['REMOTE_ADDR'];
}
return $ip;
}
$ip_address = VisitorIP();
$geodata = file_get_contents('http://api.ipinfodb.com/v3/ip-country/?key=0000&ip=' . $ip_address . '&format=json');
$decoded = json_decode($geodata);
$country = strtolower($decoded->countryCode);
【问题讨论】:
-
总能看看phpBB。尽管有各种条件(包括代理),但他们有一个非常完整的方法来获取用户的 IP。
-
var_dump($ip_address)对于没有给您的访问者。里面有什么? -
访问者必须有一个 IP 地址,否则他们无法收到响应。您还应该专门使用
$_SERVER['REMOTE_ADDR'],所有其他值都无法确认并且可能是伪造的。 -
当你调用VisitorIP时,“没有IP”的用户会得到什么?每个 TCP 连接必须有一个 IP,所以你的函数应该返回一些东西。但是,您盲目地相信 CLIENT_IP 和 FORWARDED_FOR 变量设置正确 - 它们是使用提供的数据,可以伪造/伪造。
-
顺便说一句,phpBB3/common.php 代码突出显示 IP 查找。