Получить реальный IP пользователя с помощью codeigniter

мое приложение отслеживает IP-адреса пользователей, входящих на сайт. Отслеживание отлично работало на обычном веб-сервере (мы были на hostgator), но, казалось, начали отслеживать нечетные IP-адреса, когда мы переключаемся на платформу PaaS (pagodabox) после разговора с поддержкой pagodabox они сообщили мне, что IPS codeigniter поднимает был IPs балансировщиков нагрузки/маршрутизаторов pagodabox и получить фактический IP-адрес пользователя, я должен был бы использовать HTTP_X_FORWARDED_FOR

я использовал функция входного класса codeigniter $this->input->ip_address() для восстановления IP-адреса пользователя. Я посмотрел на функцию и заметил, что у них есть какие-то функции, чтобы отступить HTTP_X_FORWARDED_FOR значение IP, но я не уверен, как его использовать. Должен ли я что-то изменить/добавить в конфигурацию?

EDIT: после того, как несколько пользователей указали, где я должен добавить в список IP-адресов балансировщиков нагрузки, возник новый вопрос: Что бы я сделал, если бы список IP-адресов часто менялся? (т. е. нет статического IP, все динамические)

7 ответов


Я уверен, что вы уже решили это, но я думал, что после правильного ответа на будущее. Я столкнулся с этой же проблемой(используя балансировщики нагрузки на AWS с приложением CodeIgniter.) Как вы указали, достаточно легко получить правильный IP-адрес за балансировщиком нагрузки или другой распределенной средой, используя заголовок HTTP_X_FORWARDED_FOR. Проблема в том, как правильно реализовать это решение в CodeIgniter? Как указывает предыдущий ответ: напишите свою собственную функцию IP. Проблема в том, что если ip_address() вызывается во всем вашем приложении? Не лучше ли переопределить эту функцию (с тем, который смотрит на правильный заголовок)? CodeIgniter имеет удобный для этого механизм, который удобен:

решение состоит в том, чтобы расширить входной класс CodeIgniter, создав новый файл класса в /application/core под названием MY_Input.php (MY_-настраиваемый префикс для расширений, его можно изменить в конфигурационном файле). С расширениями вы можете создайте функцию с тем же именем, что и исходный метод класса, не нарушая ничего и не редактируя основные файлы. Вместо этого CodeIgniter будет использовать ваш новый метод. Ваш расширенный класс ввода будет выглядеть примерно так:

class MY_Input extends CI_Input {

    function __construct()
    {
        parent::__construct();
    }
    //Overide ip_address() with your own function
    function ip_address() 
    {
        //Obtain the IP address however you'd like, you may want to do additional validation, etc..
        $correct_ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];  
        return $correct_ip_address;
    }
}

таким образом, мы изменили поведение ядра без взлома фреймворка, и существующие вызовы ip_address() во всем вашем приложении теперь будут использовать ваш метод.

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


решение Оливера работает, но в некоторых случаях лучше использовать следующее, Если вы знаете IP-адреса прокси, которые используются. Отредактируйте приложение / config / config.php файл включает в себя следующее:

$config['proxy_ips'] = '1.2.3.4, 2.3.4.5';

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


<?php 
function getIPfromXForwarded() 
{ 
    $ipString = @getenv("HTTP_X_FORWARDED_FOR"); 
    $addr     = explode(",",$ipString); 

    return $addr[sizeof($addr)-1]; 
} 
?> 

попробуйте что-то вроде этого. Посмотрим, сработает ли. Использование:

<? echo getIPfromXForwarded(); ?>

в вашем случае вы можете добавить указанный IP балансировщика нагрузки в $config['proxy_ips'] (application/config/config.php), например:

$config['proxy_ips'] = ['192.168.1.2'];

динамический прокси IP:

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

 $config['proxy_ips'] = '192.168.1.0/24';

функция маски способна в Codeigniter 3


получить метод IP:

$this->input->ip_address();

пока $this относится к CI пример.

этот метод учитывает параметр $config ['proxy_ips'] и возвращает сообщенный адрес HTTP_X_FORWARDED_FOR, HTTP_CLIENT_IP, HTTP_X_CLIENT_IP или HTTP_X_CLUSTER_CLIENT_IP для разрешенных IP-адресов.


я наткнулся на версию решения Thava, которая отлично подходит для ситуаций, когда IPs балансировщика нагрузки может меняться (например, AWS) и по-прежнему использует конфигурационные файлы СНГ изначально. Когда вы знаете, что работаете за LB, вы можете изменить конфигурацию.php должен быть:

$config['proxy_ips'] = isset($_SERVER["REMOTE_ADDR"]) ? $_SERVER["REMOTE_ADDR"] : '';

зная, что REMOTE_ADDR всегда будет текущим LB.

спасибо Эрик Браун здесь https://expressionengine.com/forums/archive/topic/185751/amazon-load-balancing-and-codeigniter-configproxy_ips#925678


Я знаю, что есть хороший ответ, который имеет отношение к вашему вопросу и принимается вами, но для будущих пользователей я разделяю функцию, которая отлично работает для меня во всех ситуациях.

 public function ip()
    {
        $ipaddress = '';
        if ($_SERVER['HTTP_CLIENT_IP'])
            $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
        else if($_SERVER['HTTP_X_FORWARDED_FOR'])
            $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
        else if($_SERVER['HTTP_X_FORWARDED'])
            $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
        else if($_SERVER['HTTP_FORWARDED_FOR'])
            $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
        else if($_SERVER['HTTP_FORWARDED'])
            $ipaddress = $_SERVER['HTTP_FORWARDED'];
        else if($_SERVER['REMOTE_ADDR'])
            $ipaddress = $_SERVER['REMOTE_ADDR'];
        else
            $ipaddress = 'UNKNOWN';
        echo $ipaddress ;
     }

У меня была такая же ситуация на работе, за исключением того, что IP-адреса не были действительно "динамическими", но "люди инфраструктуры", управляющие прокси и балансировщики нагрузки, использовали их для изменения по нераскрытым причинам. Поэтому нам пришлось договариваться, и мы придумали решение, создающее крюк в их инструменте управления конфигурацией/предоставлением, чтобы написать конфигурационный файл где-нибудь (в папке, доступной для пользователя, работающего с нашим Apache/PHP).

поэтому я использовал крючок CI для чтения этого файла в системе bootstrap для изменения конфигурации моих приложений, обновления значений, таких как список IP-адресов прокси, путь кэша, домен cookie и т. д.