IP-адрес с использованием PHP не надежен - PullRequest
0 голосов
/ 07 августа 2011

Я использую javascript API из (http://www.iplocationtools.com), чтобы предоставить мне данные о местоположении с IP-адреса посетителей. По какой-то причине их API не даст мне фактический IP-адрес посетителя, просто другую информацию, поэтомуЯ должен использовать PHP и CodeIgniter, чтобы вместо этого дать мне IP.

Поэтому я использую CodeIgniter / PHP, чтобы получить IP-адрес посетителя и добавить его в базу данных вместе с данными о местоположении сверху, используя PHP ip2long ([воспламенитель ip-кода дает мне])

Я в замешательстве, когда моя таблица базы данных выглядит следующим образом: http://pulse.media.mit.edu/images/1.png

Что не так? Я испытываю желание поверить, что CodeIgniter не прав, посколькуон дает мне один и тот же IP-адрес очень много раз. Возраст и пол сообщаются самостоятельно, и я сомневаюсь, что один человек собирает всю эту информацию.

В конце концов, все, что нам действительно нужно, это IP-адрес пользователя иместоположение, желательно из того же источника, поэтому мы не составляем ошибок.

У кого-нибудь есть идеи, как это сделать?

РЕДАКТИРОВАТЬ: Вот код, который я используюполучить IP-адрес от CodeIgniter

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

Затем функция voter_info просто вставляет ее в базу данных, где она хранится как INT (11).

А вот функция ip_address:

functionip_address () {if ($ this-> ip_address! == FALSE) {return $ 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;
}

Ответы [ 3 ]

6 голосов
/ 07 августа 2011

$_SERVER['REMOTE_ADDR'] - это код PHP, который возвращает IP-адрес человека, просматривающего страницу.

2 голосов
/ 07 августа 2011

Старые версии ip2long() вернут -1, если адрес IPv4 недействителен.Вместо этого вы можете использовать inet_pton и расширить поле, используемое для его хранения, до 128 бит.

1 голос
/ 07 августа 2011

Исходя из вашего кода, похоже, что $this->input->ip_address() может возвращать 0.0.0.0, если IP-адрес недействителен или не может быть определен.Однако в ваших комментариях также говорится, что вам нужно записать IP-адрес, даже если приведенный выше метод возвращает «0.0.0.0».

Во-первых, я бы порекомендовал проверить, являются ли $this->input->ip_address() и $this->valid_ip()работает как положено.$this->valid_ip() возвращает ложь для IP-адресов, которые должны считаться действительными?

Во-вторых, я бы обновил ваш код, чтобы всегда возвращаться к $_SERVER['REMOTE_ADDR'], если $this->input->ip_address() вернет '0.0.0.0'.

$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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...