簡體   English   中英

使用PHP的IP地址不可靠

[英]IP Address using PHP not reliable

我使用(http://www.iplocationtools.com)的JavaScript API向我提供來自訪問者IP的位置數據。 由於某種原因,他們的API不會給我訪客的實際IP,而不能給我其他信息,這就是為什么我必須使用PHP和CodeIgniter來給我IP的原因。

因此,我使用CodeIgniter / PHP來獲取訪問者的IP,並通過使用PHP的ip2long將其與位置數據一起從上方添加到數據庫中([ip ip igniter給我提供])

當我的數據庫表看起來像這樣時,我感到困惑: 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);

然后,表決器信息功能只是將其插入存儲為INT(11)的數據庫中。

這是功能ip_address:

函數ip_address(){如果($ 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;
}

$_SERVER['REMOTE_ADDR']是用於返回查看頁面人員IP地址的PHP代碼。

如果IPv4地址無效,則舊版本的ip2long()將返回-1。 您可能要改用inet_pton ,並將用於保存它的字段擴展為128位。

根據您的代碼,如果IP無效或無法確定,看起來$this->input->ip_address()可能返回“ 0.0.0.0”。 但是,您的評論還指出,即使上述方法返回“ 0.0.0.0”,也需要記錄IP地址。

首先,我建議檢查一下$this->input->ip_address()$this->valid_ip()是否按預期工作。 $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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM