Intereting Posts
Вставить tr после каждого третьего цикла isset и! empty, не проходя проверку чеком для загруженных файлов PHP: отправить запрос POST, а затем прочитать ответ XML? Отправка уведомлений в Google Cloud Messaging с помощью php дает мне несанкционированную ошибку 401 domai name availbility checker загрузка, обработка, хранение и доставка предоставленных пользователем файлов и изображений Как оптимизировать хранение и выбор из огромного списка в php? Расчет php дает странный результат для 1500000-20% неожиданный $ end определить замыкание как метод из класса могу ли я получить значение unicode символа или наоборот с php? Как преобразовать дерево DOM в изображение Как структурировать этот SQL-запрос. Объединение нескольких таблиц? Как мы можем отправлять сообщения GCM в большом количестве 1000 в базу данных, скажем, из 10 000 зарегистрированных пользователей? Отправлять электронную почту Outlook 2010 с помощью PHP

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

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

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

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

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

Решение состоит в том, чтобы расширить класс ввода CodeIgniter, создав новый файл класса в / application / core с именем MY_Input.php (MY_ – настраиваемый префикс для расширений, вы можете изменить его в своем файле конфигурации). С помощью расширений вы можете создать функцию имени SAME как исходного метода класса, не нарушая ничего, и не редактируя файлы ядра. 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, заголовок HTTP_X_FORWARDED_FOR всегда содержит правильный IP-адрес клиента.

Решение Oliver работает, но в некоторых случаях лучше использовать следующее, если вам известны IP-адреса прокси-сервера, которые используются. Отредактируйте файл application / 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(); ?> 

Я столкнулся с версией решения Thava, которая отлично подходит для ситуаций, когда IP-адреса балансировки нагрузки могут меняться (например, AWS) и по-прежнему использовать файлы конфигурации CI. Когда вы знаете, что работаете за LB, вы можете изменить config.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 для чтения этого файла в системном бутстрапе, чтобы изменить конфигурацию моих приложений, обновив такие значения, как список IP-адресов прокси, путь кэш-памяти, домен cookie и т. Д.

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

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

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

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

  $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-адресов.