【问题标题】:getting ip address not accurate in php在php中获取IP地址不准确
【发布时间】:2018-10-29 11:26:51
【问题描述】:

我有一个应用程序可以在 php 中获取用户 ip 地址所在位置的纬度和经度,但结果并不准确,这是我的代码

<form action="" method="POST">
<input type="submit" name="ipBtn" value="Get ip address">
    <?php 
     if(isset($_POST['ipBtn'])) {
        $user_ip = getenv('REMOTE_ADDR');
        $geo = unserialize(file_get_contents("http://www.geoplugin.net/php.gp?ip=$user_ip"));
        $country = $geo["geoplugin_countryName"];
        $region = $geo["geoplugin_region"];
        $longitude = $geo["geoplugin_longitude"];
        $latitude = $geo["geoplugin_latitude"];
        $first_name = $_GET[userName];
        $password = $_GET['last_name'];
    ?>

</form>

【问题讨论】:

  • “不准确”具体是什么意思?您是否得到了似乎不准确的结果,或者根本没有结果?
  • IP 到位置服务从来都不是很准确,对我来说可能是几百公里的错误,错误的城市
  • 我们甚至会遇到问题,因为我们使用一种服务(如 MaxMind),而链接的网站使用另一种服务……他们甚至完全不同意 IP 位于哪个整个国家;)

标签: php ip-address


【解决方案1】:

获取访问者/客户的IP address 的最简单方法是使用$_SERVER['REMOTE_ADDR']$_SERVER['REMOTE_HOST'] 变量。

但是,有时这不会返回访问者的正确 IP 地址,因此我们可以使用其他一些服务器变量来获取 IP 地址。

以下两个函数是等价的,不同之处仅在于检索值的方式和来源。

getenv() 用于在 PHP 中获取环境变量的值。

// Function to get the client IP address
function get_client_ip() {
    $ipaddress = '';
    if (getenv('HTTP_CLIENT_IP'))
        $ipaddress = getenv('HTTP_CLIENT_IP');
    else if(getenv('HTTP_X_FORWARDED_FOR'))
        $ipaddress = getenv('HTTP_X_FORWARDED_FOR');
    else if(getenv('HTTP_X_FORWARDED'))
        $ipaddress = getenv('HTTP_X_FORWARDED');
    else if(getenv('HTTP_FORWARDED_FOR'))
        $ipaddress = getenv('HTTP_FORWARDED_FOR');
    else if(getenv('HTTP_FORWARDED'))
       $ipaddress = getenv('HTTP_FORWARDED');
    else if(getenv('REMOTE_ADDR'))
        $ipaddress = getenv('REMOTE_ADDR');
    else
        $ipaddress = 'UNKNOWN';
    return $ipaddress;
}

$_SERVER 是一个数组,其中包含由 Web 服务器创建的服务器变量。

// Function to get the client IP address
function get_client_ip() {
    $ipaddress = '';
    if (isset($_SERVER['HTTP_CLIENT_IP']))
        $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
    else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
        $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_X_FORWARDED']))
        $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
    else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
        $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_FORWARDED']))
        $ipaddress = $_SERVER['HTTP_FORWARDED'];
    else if(isset($_SERVER['REMOTE_ADDR']))
        $ipaddress = $_SERVER['REMOTE_ADDR'];
    else
        $ipaddress = 'UNKNOWN';
    return $ipaddress;
}

【讨论】:

  • 这是一段非常糟糕的代码,需要停止共享。将任意、非标准的 HTTP 标头(例如 Forwarded:Client-IP:)作为 IP 地址的来源是不恰当且危险的。
  • 您已经改进了格式,但您的代码的根本问题仍然存在。在某些非常特定的环境之外,永远不应将 HTTP 标头视为用户 IP 地址的来源。
  • 在这里查看答案:stackoverflow.com/questions/44085102/… 正如@duskwuff 已经说过的那样,这很危险。标题很容易被用户操纵。
猜你喜欢
  • 1970-01-01
  • 2010-12-15
  • 2011-02-07
  • 1970-01-01
  • 2011-03-14
  • 2014-11-26
  • 2014-07-05
  • 2013-07-07
  • 1970-01-01
相关资源
最近更新 更多