【问题标题】:IP Address using PHP not reliable使用 PHP 的 IP 地址不可靠
【发布时间】:2011-08-07 05:20:35
【问题描述】:

我使用来自 (http://www.iplocationtools.com) 的 javascript API 向我提供来自访问者 IP 的位置数据。出于某种原因,他们的 API 不会给我访问者的实际 IP,只是其他信息,这就是为什么我必须使用 PHP 和 CodeIgniter 来给我 IP。

所以我使用 CodeIgniter/PHP 获取访问者的 IP,并使用 PHP 的 ip2long([ip 代码点火器给我])将其与上面的位置数据一起添加到数据库中

当我的数据库表看起来像这样时,我很困惑:http://pulse.media.mit.edu/images/1.png

哪里错了?我很想相信 CodeIgniter 是错误的,因为它多次给我相同的 IP。年龄和性别是自我报告的,我怀疑所有这些信息都是由一个人编造的。

归根结底,我们真正需要的只是用户 IP 和位置,最好来自同一来源,这样我们就不会复合错误。

有人对如何做到这一点有更好的想法吗?

编辑:这是我用来从 CodeIgniter 获取 IP 地址的代码

$data['ip_address'] = ip2long($this->input->ip_address());
$this->pulse_model->voter_info($data);

然后 voter_info 函数只是将它插入到数据库中,它以 INT(11) 的形式存储。

这里是函数ip_address:

函数 ip_address() { if ($this->ip_address !== FALSE) { 返回 $this->ip_address; }

    if (config_item('proxy_ips') != '' && $this->server('HTTP_X_FORWARDED_FOR') && $this->server('REMOTE_ADDR'))
    {
        $proxies = preg_split('/[\s,]/', config_item('proxy_ips'), -1, PREG_SPLIT_NO_EMPTY);
        $proxies = is_array($proxies) ? $proxies : array($proxies);

        $this->ip_address = in_array($_SERVER['REMOTE_ADDR'], $proxies) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
    }
    elseif ($this->server('REMOTE_ADDR') AND $this->server('HTTP_CLIENT_IP'))
    {
        $this->ip_address = $_SERVER['HTTP_CLIENT_IP'];
    }
    elseif ($this->server('REMOTE_ADDR'))
    {
        $this->ip_address = $_SERVER['REMOTE_ADDR'];
    }
    elseif ($this->server('HTTP_CLIENT_IP'))
    {
        $this->ip_address = $_SERVER['HTTP_CLIENT_IP'];
    }
    elseif ($this->server('HTTP_X_FORWARDED_FOR'))
    {
        $this->ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
    }

    if ($this->ip_address === FALSE)
    {
        $this->ip_address = '0.0.0.0';
        return $this->ip_address;
    }

    if (strpos($this->ip_address, ',') !== FALSE)
    {
        $x = explode(',', $this->ip_address);
        $this->ip_address = trim(end($x));
    }

    if ( ! $this->valid_ip($this->ip_address))
    {
    $this->ip_address = '0.0.0.0';
    }
    return $this->ip_address;
}

【问题讨论】:

  • 你能告诉我们你使用 CodeIgniter/PHP 获取 IP 地址的代码吗?
  • 您所有 IP 的数量是 32 位有符号整数 (en.wikipedia.org/wiki/2147483647#2147483647_in_computing) 的最大值,所以我的想法是 codeigniter 为每个人的 IP 提供类似 255.255.255.255 的值,或者您在从 codeigniter 获取它并将其存储在数据库中之间的某个地方重新处理它。您是否尝试回显从 codeigniter 获得的 IP 地址以查看它是否有效?
  • 我添加了上面的代码段。
  • 你能确认$this->input->ip_address()返回一个有效的IP地址吗?
  • 有一个函数 valid_ip() 但如果返回 false,我仍然需要用户 IP 来跟踪他们在世界上的位置。那不可能吗?我之前使用的 javascript API 似乎可以将大多数用户解析到某个位置。如果我连IP都拿不到,他们会编造吗?如果他们只让我拥有访问者的 IP 会更容易,但他们没有。

标签: php javascript mysql codeigniter geolocation


【解决方案1】:

$_SERVER['REMOTE_ADDR'] 是 PHP 代码,用于返回查看页面的人的 IP 地址。

【讨论】:

    【解决方案2】:

    如果 IPv4 地址无效,旧版本的 ip2long() 将返回 -1。您可能想改用 inet_pton 并将用于保存它的字段扩展为 128 位。

    【讨论】:

      【解决方案3】:

      根据您的代码,如果 IP 无效或无法确定,$this->input->ip_address() 似乎有可能返回“0.0.0.0”。但是,您的 cmets 还声明即使上述方法返回 '0.0.0.0',您也需要记录 ip 地址。

      首先,我建议检查$this->input->ip_address()$this->valid_ip() 是否按预期工作。 $this->valid_ip() 是否为应该被视为有效的 IP 返回 false?

      其次,如果$this->input->ip_address() 返回“0.0.0.0”,我会更新您的代码以始终回退到$_SERVER['REMOTE_ADDR']

      $ip_address = $this->input->ip_address();
      if($ip_address == '0.0.0.0') {
          $ip_address = $_SERVER['REMOTE_ADDR'];
      }
      $data['ip_address'] = ip2long($ip_address);
      $this->pulse_model->voter_info($data);
      

      或者,如果您愿意,您不能使用 $this->input->ip_address() 并按照 @rockerest 的建议进行操作,而只能使用 $_SERVER['REMOTE_ADDR'] 来陪伴。

      $data['ip_address'] = ip2long($_SERVER['REMOTE_ADDR']);
      $this->pulse_model->voter_info($data);
      

      【讨论】:

        猜你喜欢
        • 2011-08-12
        • 1970-01-01
        • 2018-03-19
        • 2010-11-22
        • 2016-12-06
        • 2011-06-09
        • 1970-01-01
        • 2021-10-06
        • 1970-01-01
        相关资源
        最近更新 更多